网站首页 > java教程 正文
点击头像,进入个人中心,查看文章合集,还有更多Python相关的精彩教程等着你!
第 7 章:编译与性能优化
在前几章,我们学习了正则的各种语法与应用。
本章我们要解决一个实际问题:
当数据量很大时,如何让正则 运行得更快?
7.1 为什么要编译正则?
每次调用 re.match() / re.search() 等方法时:
- Python 内部会先解析正则表达式
- 然后再执行匹配
如果同一个正则要多次使用,频繁解析会浪费性能。
解决办法:使用 re.compile() 先编译一次,后续重复使用。
7.2 基本用法:re.compile()
import re
pattern = re.compile(r"\d{4}-\d{2}-\d{2}") # 编译正则
dates = ["2025-09-05", "1999-01-01", "hello"]
for d in dates:
if pattern.match(d):
print("合法日期:", d)
输出:
合法日期: 2025-09-05
合法日期: 1999-01-01
7.3 提升性能的技巧
技巧 1:预编译正则
如果在循环里重复用同一个正则,一定要 compile。
import re
pattern = re.compile(r"\d+")
numbers = ["abc123", "456xyz", "no_digits"]
for s in numbers:
if pattern.search(s):
print("找到数字:", s)
技巧 2:避免低效的模式
一些写法会拖慢速度:
低效写法 | 高效写法 | 原因 |
.*a | [^a]*a | .* 会疯狂回溯 |
`(a | b | c |
(abc)* | (?:abc)* | 非捕获组更轻量 |
技巧 3:使用非捕获分组 (?: … )
如果只是为了分组,而不需要捕获结果,推荐用 非捕获分组。
import re
# 捕获分组(多余)
pattern1 = re.compile(r"(?:ab|cd)+")
pattern2 = re.compile(r"(ab|cd)+") # 性能略差
print(pattern1.match("abcdab")) # <re.Match ...>
技巧 4:控制回溯
正则引擎会“试探性回溯”,在复杂表达式里可能非常慢。
常见优化方法:
- 避免 .* 这种“贪婪全局”匹配
- 用 ? 变为非贪婪
- 尽量用明确的量词 {m,n}
7.4 使用 finditer() 处理大文本
findall() 会一次性返回所有结果,可能很占内存。
推荐用 finditer():返回一个迭代器,每次取一个匹配。
import re
text = "number: " + "123 " * 100000
pattern = re.compile(r"\d+")
count = 0
for m in pattern.finditer(text):
count += 1
print("匹配次数:", count)
输出:
匹配次数: 100000
7.5 使用 fullmatch() 替代 ^...$
很多人会写:
re.match(r"^\d+#34;, "123")
其实更推荐:
re.fullmatch(r"\d+", "123")
这样更直观,也能避免错误。
7.6 图示:编译与回溯
假设正则:a.*b
字符串:accccccccccccb
匹配过程:
a cccccccccccb
^ ^
从头到尾匹配,.* 会不断尝试回溯,直到遇到 b
如果写成 a[^b]*b,则一次性就能匹配成功。
7.7 小练习
请写正则并优化:
- 判断一个字符串是否是合法的 IPv4 地址(例如 192.168.0.1)。
- 提取字符串 "color: #FFEEAA; background: #123456;" 中所有 十六进制颜色代码。
- 从超长日志中提取所有日期(格式 YYYY-MM-DD),要求内存占用尽量小。
本章你学到了:
- 使用 re.compile() 预编译正则
- 优化正则性能的方法(避免回溯、非捕获分组、字符类优化)
- 大数据处理时推荐 finditer()
- fullmatch() 更直观替代 ^...$
下一章(第 8 章),我们会进入 正则表达式的实战案例:日志分析、数据提取、文本清洗等。
- 上一篇: XLOOKUP+正则表达式,释放强大的查询潜力
- 下一篇: 正则表达式测试工具_正则 测试
猜你喜欢
- 2025-09-24 30个Excel/WPS新公式实战大全,效率翻倍不是梦!
- 2025-09-24 Ngnix的server_name正则匹配执行顺序
- 2025-09-24 学习VBA,报表做到飞 第四章 正则表达式 4.12 正则表达式与数组结合
- 2025-09-24 用正则表达式解代数方程_用正则表达式解代数方程怎么写
- 2025-09-24 Django路由配置方法全解_请简述django的url路由流程
- 2025-09-24 这几种正则表达式的“字符集合”,想要入门regexp函数,必须了解
- 2025-09-24 玩转Spring中强大的spel表达式!_spring的scope有几种
- 2025-09-24 Python中使用正则表达式_python 正则表达
- 2025-09-24 Python 正则表达式教程 第 4 章:贪婪与非贪婪匹配
- 2025-09-24 5分钟掌握Python(十六)之正则表达式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)