Python正则表达式学习
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 可视化分析
通过这个教程,你可以逐步掌握:
- 从基础匹配到高级模式的应用
- 常见文本处理场景的解决方案
- 正则表达式性能优化技巧
- 复杂模式的设计与调试方法