提高正则表达式效率的一些感悟

1.加快匹配失败的速度。如果要匹配的信息数量远小于所有文本数量,那么匹配失败的次数是远远大于匹配成功的次数的,这样一来绝大部分时间是花在匹配失败上了。这时候应该注意你正则表达式匹配失败的速度。加速正则表达式匹配失败的速度,也是加快了整个匹配过程的速度。
2.范围问题。适当缩小匹配的范围,找到带匹配文本的显著特征,在你正则表达式中暴露出来,可以很大程度上缩小正则表达式的匹配范围。例如:我要匹配的文本中含有一个¥符号,全文中¥符号恰巧数量很少,这时候暴露出来¥,就会很大程度上缩小范围。
3.使用非捕获组替代捕获组。捕获组花费时间和内存用于记录后向引用,并保持它们是最新的。如果不需要一个后向引用,可通过使用非捕获组避免这种开销。
4.减少回溯次数。减少回溯次数的办法我是用的主要有:减少分支数量、使用恰当的量词、将常用的分支放在最左边。
减少分支数量:在使用分支条件 | 时,分支过多会造成回溯次数过多。不是必要使用分支的话,可以使用字符类。当必须使用分支的时候,尽量将出现次数多的分支放在前面。例如我要匹配 之前、以前、前、往前,我大体统计下“以前”出现的次数最多,其次是之前、前、往前,于是我可以写成(?:以前|之前|前|往前)
使用恰当的量词:比如我能确定要匹配的字符串的大致长度,我尽量写成{1,5}而不是{1,}、{0,}、*、+。总之将贪婪模式变成非贪婪模式。
tips:上面的 前、之前……我如果写成[之以往前]{1,2}匹配效率会提升很多,但同时要避免跟其他正则表达式匹配范围重合。例如上面的与[之以往后]{1,2}匹配范围重复。
5.将复杂的过长的正则式拆开,分成几个正则式进行匹配。
6.能用程序代码解决的问题别用正则表达式。例如,我想判断文本中有没有“日期不限”、“不限期限”这样的字眼。使用正则式回溯次数太多。在python中使用if “日期不限” or “不限期限” in my_string: pass

2 thoughts on “提高正则表达式效率的一些感悟”

发表评论

电子邮件地址不会被公开。 必填项已用*标注