网站 用户体验 考虑网站排版图片
Python正则表达式全攻略
一、正则表达式基础
1. 什么是正则表达式?
- 用于描述字符串匹配规则的表达式
 - 广泛应用于文本处理、表单验证、数据清洗等领域
 
2. Python中的re模块
import re
 
3. 基础语法
| 字符 | 说明 | 示例 | 
|---|---|---|
| . | 匹配任意字符(除换行) | a.c → abc | 
| \d | 数字 [0-9] | \d\d → 42 | 
| \D | 非数字 | \D → a | 
| \w | 字母数字下划线 | \w+ → Ab3_ | 
| \W | 非单词字符 | \W → % | 
| \s | 空白字符 | \s → 空格 | 
| \S | 非空白字符 | |
| ^ | 字符串开始 | ^abc | 
| $ | 字符串结束 | xyz$ | 
二、量词与分组
1. 量词
*      # 0次或多次
+      # 1次或多次
?      # 0次或1次
{n}    # 正好n次
{n,}   # 至少n次
{n,m}  # n到m次
 
2. 分组与或运算
()       # 捕获分组
(?:)     # 非捕获分组
|        # 或运算
(?P<name>) # 命名分组
 
三、re模块常用方法
1. 匹配方法
re.match()     # 从字符串起始位置匹配
re.search()    # 扫描整个字符串
re.findall()   # 返回所有匹配结果
re.finditer()  # 返回迭代器
re.sub()       # 替换匹配内容
 
2. 使用示例
text = "Phone: 123-456-7890, 555-1234"# 查找所有电话号码
numbers = re.findall(r'\d{3}-\d{3}-\d{4}', text)# 替换电话号码格式
new_text = re.sub(r'(\d{3})-(\d{3})-(\d{4})', r'(\1) \2-\3', text)
 
四、进阶技巧
1. 编译正则表达式
pattern = re.compile(r'\b[A-Za-z]+\b')
matches = pattern.findall(text)
 
2. 标志参数
re.IGNORECASE  # 忽略大小写
re.MULTILINE   # 多行模式
re.DOTALL      # 使.匹配换行符
 
3. 贪婪与非贪婪
.*    # 贪婪匹配
.*?   # 非贪婪匹配
 
4. 前后断言
(?=exp)   # 正向后行断言
(?!exp)   # 负向后行断言
(?<=exp)  # 正向前行断言
(?<!exp)  # 负向前行断言
 
五、实战案例
1. 邮箱验证
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
is_valid = re.match(email_pattern, "user@example.com")
 
2. 提取网页链接
html = '<a href="https://example.com">Link</a>'
links = re.findall(r'href=["\'](https?://.*?)["\']', html)
 
3. 日志分析
log = "2023-08-20 14:30:45 [ERROR] Connection timeout"
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) \[(\w+)\] (.*)'
match = re.match(pattern, log)
 
4. 数据清洗
dirty_data = "Price: $1,234.56 (50% OFF!)"
clean = re.sub(r'[^\d.]', '', dirty_data)  # 保留数字和小数点
 
5. 复杂密码验证
password_pattern = r'''
^(?=.*[A-Z])       # 至少一个大写字母
(?=.*[a-z])       # 至少一个小写字母
(?=.*\d)          # 至少一个数字
(?=.*[@$!%*?&])   # 至少一个特殊字符
[A-Za-z\d@$!%*?&]{8,}$  # 总长度至少8
'''
is_strong = re.search(password_pattern, "Passw0rd!", re.VERBOSE)
 
六、性能优化
- 预编译常用正则表达式
 - 避免过度使用.*
 - 使用原子组防止回溯爆炸
 - 优先使用具体字符集代替.
 - 合理使用^和$锚定
 
七、常见问题
- 特殊字符未转义(如.需要写成.)
 - 贪婪匹配导致意外结果
 - 忘记处理多行模式
 - 分组引用错误(\1 vs $1)
 - Unicode字符处理
 
八、调试工具推荐
- RegExr 在线测试工具
 - Python的re.DEBUG标志
 - regex101 可视化分析
 
通过这个教程,你可以逐步掌握:
- 从基础匹配到高级模式的应用
 - 常见文本处理场景的解决方案
 - 正则表达式性能优化技巧
 - 复杂模式的设计与调试方法
 
