Python re模块知识点汇总
正则表达式保姆级教程 – 编程小白也能轻松学会文本处理
正则表达式就像是文本处理的”瑞士军刀”,能让你在文本大海中快速找到想要的”小鱼”!
Python的re模块提供了正则表达式的所有功能,下面用大白话带你全面掌握!
1. 什么是正则表达式?
正则表达式(Regular Expression)是一种强大的文本匹配工具,可以理解为:
- 🔍 高级查找工具:在一大段文字中快速找到特定模式的文本
- 📝 文本模板:定义你要查找的文本长什么样
- 🛠️ 处理利器:查找、替换、分割文本的高级工具
为什么学习re模块?
- 处理日志文件提取关键信息
- 验证用户输入的格式(邮箱、电话等)
- 从HTML/文本中提取数据
- 批量修改文档内容
- 比普通字符串方法更强大的文本处理能力
💡 简单理解:普通字符串方法只能找固定文本(如”abc”),正则表达式能找变化模式(如”所有以a开头、c结尾的3字母单词”)
2. re模块核心函数
① re.search() – 大海捞针
- 在整个字符串中搜索匹配模式
- 找到第一个匹配就返回
- 返回Match对象(包含匹配信息),没找到返回None
import re
text = “电话:123-4567, 备用:890-1234”
match = re.search(r’\d{3}-\d{4}’, text)
# 找到第一个电话号码:123-4567
text = “电话:123-4567, 备用:890-1234”
match = re.search(r’\d{3}-\d{4}’, text)
# 找到第一个电话号码:123-4567
② re.match() – 守门员检查
- 只检查字符串开头是否匹配
- 开头不匹配直接返回None
text = “姓名: 张三”
re.match(r’姓名’, text) # 匹配成功
re.match(r’张三’, text) # 开头不是”张三”,匹配失败
re.match(r’姓名’, text) # 匹配成功
re.match(r’张三’, text) # 开头不是”张三”,匹配失败
③ re.findall() – 全搜索小能手
- 找出字符串中所有匹配项
- 返回字符串列表
text = “苹果¥5, 香蕉¥3, 橙子¥4”
prices = re.findall(r’¥(\d+)’, text)
# 返回 [‘5’, ‘3’, ‘4’]
prices = re.findall(r’¥(\d+)’, text)
# 返回 [‘5’, ‘3’, ‘4’]
④ re.finditer() – 高级版findall
- 和findall一样找所有匹配项
- 返回Match对象迭代器(可以获取更多匹配信息)
⑤ re.sub() – 文本替换神器
- 查找并替换匹配的文本
text = “今天是2023-08-15”
new_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})’, r’\2/\3/\1′, text)
# 替换为 “今天是08/15/2023”
new_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})’, r’\2/\3/\1′, text)
# 替换为 “今天是08/15/2023”
⑥ re.split() – 智能切割机
- 用正则表达式作为分隔符切割字符串
- 比str.split()更灵活的分割方式
3. 正则表达式语法手册
常用元字符(特殊符号)
- . – 匹配任意单个字符(换行符除外)
- \w – 匹配字母、数字、下划线(等价于[a-zA-Z0-9_])
- \d – 匹配数字(等价于[0-9])
- \s – 匹配空白字符(空格、制表符等)
- ^ – 匹配字符串的开头
- $ – 匹配字符串的结尾
数量词(匹配多少次)
- * – 匹配0次或多次
- + – 匹配1次或多次
- ? – 匹配0次或1次
- {n} – 匹配恰好n次
- {n,} – 匹配至少n次
- {n,m} – 匹配n到m次
字符类(匹配其中之一)
[abc] # 匹配a、b或c
[a-z] # 匹配任意小写字母
[^0-9] # 匹配非数字字符(^在[]内表示”排除”)
[a-z] # 匹配任意小写字母
[^0-9] # 匹配非数字字符(^在[]内表示”排除”)
分组捕获(提取关键部分)
- ( ) – 分组并捕获匹配内容
- (?: ) – 分组但不捕获(提高性能)
text = “张伟 1990年出生”
match = re.search(r'(\w+)\s(\d{4})’, text)
# match.group(1) → “张伟”
# match.group(2) → “1990”
match = re.search(r'(\w+)\s(\d{4})’, text)
# match.group(1) → “张伟”
# match.group(2) → “1990”
或操作符
- | – 匹配左边或右边的内容
re.search(r’苹果|香蕉’, “我喜欢香蕉”) # 匹配”香蕉”
📌 正则表达式中反斜杠\
是转义字符,所以写\d
时Python中要写成r'\d'
或'\\d'
4. 高级技巧与性能优化
re.compile() – 预编译加速器
- 把正则表达式先”编译”好,重复使用提高效率
- 适用于需要多次使用同一模式的场景
pattern = re.compile(r’\d{3}-\d{4}’) # 先编译
# 多次使用
result1 = pattern.search(text1)
result2 = pattern.findall(text2)
# 多次使用
result1 = pattern.search(text1)
result2 = pattern.findall(text2)
匹配标志(Flags)
- re.IGNORECASE / re.I – 忽略大小写
- re.MULTILINE / re.M – 多行模式(影响^和$)
- re.DOTALL / re.S – 让.匹配包括换行符的所有字符
re.findall(r’^hello’, ‘Hello\nhello’, re.I | re.M)
# 匹配两个hello(忽略大小写+多行模式)
# 匹配两个hello(忽略大小写+多行模式)
贪婪 vs 非贪婪匹配
- 贪婪模式(默认):尽可能匹配更长的字符串
- 非贪婪模式:在量词后加?,匹配尽量短的字符串
text = “<div>内容</div>”
# 贪婪模式(默认)
re.search(r'<.*>’, text) # 匹配整个字符串
# 非贪婪模式
re.search(r'<.*?>’, text) # 只匹配<div>
# 贪婪模式(默认)
re.search(r'<.*>’, text) # 匹配整个字符串
# 非贪婪模式
re.search(r'<.*?>’, text) # 只匹配<div>
Match对象详解
- .group() – 返回整个匹配文本
- .group(n) – 返回第n个分组的匹配
- .start() / .end() – 匹配的起止位置
- .span() – 返回(start, end)元组
⚠️ 警告:避免过度复杂的正则表达式
过于复杂的正则可能导致性能问题(如灾难性回溯)。对于复杂的文本解析,考虑结合其他解析方法。
5. 实际应用案例
案例1:验证电子邮箱格式
email_pattern = r’^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$’
def is_valid_email(email):
return re.match(email_pattern, email) is not None
def is_valid_email(email):
return re.match(email_pattern, email) is not None
案例2:提取网页中的所有链接
html = ‘<a href=”https://example.com”>链接</a>’
links = re.findall(r’href=[“\’](.*?)[“\’]’, html)
# 返回 [‘https://example.com’]
links = re.findall(r’href=[“\’](.*?)[“\’]’, html)
# 返回 [‘https://example.com’]
案例3:日志文件分析
log = “2023-08-15 12:30:45 [INFO] User login”
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) $$(\w+)$$ (.+)’
match = re.match(pattern, log)
# 分组提取:日期、时间、日志级别、消息内容
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) $$(\w+)$$ (.+)’
match = re.match(pattern, log)
# 分组提取:日期、时间、日志级别、消息内容
案例4:电话号码格式化
phone = “客服电话:400-123-4567”
formatted = re.sub(r'(\d{3})-(\d{3})-(\d{4})’, r'(\1) \2-\3′, phone)
# 结果: “客服电话:(400) 123-4567”
formatted = re.sub(r'(\d{3})-(\d{3})-(\d{4})’, r'(\1) \2-\3′, phone)
# 结果: “客服电话:(400) 123-4567”
6. 学习路径与资源推荐
正则表达式学习路线
- 掌握基础元字符 (. \d \w \s ^ $)
- 学习量词使用 (* + ? {})
- 理解字符类 ([]) 和分组 (())
- 练习常用场景(邮箱、电话、URL匹配)
- 掌握贪婪/非贪婪模式
- 学习使用re.compile()提高性能
- 处理更复杂的文本提取任务
练习建议
- 使用在线测试工具(如regex101.com)实时调试
- 从简单模式开始,逐步增加复杂度
- 多看多练常见正则表达式案例
- 实际项目中应用而不仅仅是练习
推荐学习资源
- Python官方文档:re模块
- 《Python Cookbook》正则表达式章节
- RegexOne互动教程
- 正则表达式可视化工具:regexper.com
💎 终极秘诀:正则表达式就像学外语 – 多练多用才能掌握!遇到复杂任务时,拆分成多个简单正则往往比写一个巨型正则更有效。