Python中re.findall()
是正则表达式最常用的匹配函数,用于快速提取字符串中所有符合规则的子串,返回结果为列表形式。其核心优势在于支持贪婪/非贪婪匹配、分组捕获和标志位控制,适合批量数据提取和文本分析场景。
-
基础用法
导入re
模块后,直接调用re.findall(pattern, string)
即可。例如提取文本中所有数字:re.findall(r'\d+', "订单123金额456")
返回['123', '456']
。若需预编译正则提升性能,可先compile()
再调用。 -
分组捕获
当正则包含括号分组时,findall()
优先返回分组内容而非完整匹配。例如re.findall(r'a(.*?)b', 'a1b a2b')
得到['1', '2']
,而非['a1b', 'a2b']
。需完整匹配时需避免冗余分组。 -
匹配模式控制
通过flags
参数可调整匹配行为:re.IGNORECASE
忽略大小写re.DOTALL
使.
匹配换行符re.MULTILINE
允许^/$
匹配每行首尾
-
实战技巧
- 非贪婪匹配:用
.*?
避免过度截取,如提取HTML标签内容re.findall(r'<div>(.*?)</div>', html)
- 结果转换:列表推导式快速处理结果,如
[int(x) for x in re.findall(r'\d+', text)]
- 多条件组合:复杂规则可用
|
分隔,如匹配邮箱或手机号r'\w+@\w+\.\w+|1[3-9]\d{9}'
- 非贪婪匹配:用
提示:处理大文本时建议改用finditer()
节省内存,涉及替换操作则优先考虑sub()
。正则表达式需严格测试,可用regex101在线工具调试。