1.问题描述
现在有一系列的模糊匹配规则,需要对一个文档中的每一个句子利用每一个匹配规则进行正则匹配,具体代码如下:
# sentences为句子列表
# re_str为正则表达式列表,其中元素类似 "^你好$" 这种正则表达式
for sent in sentences:
for pattern in re_str:
if re.findall(pattern, sent):
print(sent)
break
代码很简单,但是在运行时出现了一个问题,就是匹配速度非常慢,而且re_str的数量存在一个临界值,当数量大于临界值,匹配速度大大降低,当数量小于临界值,匹配速度大幅提升。
2.解决办法
首先说一下解决办法,解决办法就是利用re.complie对每一个正则表达式进行编译,具体如下:
# sentences为句子列表
# re_str为正则表达式列表,其中元素类似 "^你好$" 这种正则表达式
patterns = [re.compile(i) for i in re_str]
for sent in sentences:
for pattern in patterns :
if pattern.findall(sent):
print(sent)
break
3.原因分析
个人认为,正则表达式匹配时,首先会对正则匹配字符串进行编译,然后将编译结果进行缓存,但是缓存大小是有限的,所以当正则表达式数量达到一定规模时,新的编译结果会将之前结果覆盖,也就是说每次对一个新的句子进行匹配时都需要对所有正则表达式进行重新编译,这是主要的耗时点。反之亦然。