我想在一个大的python文件中提取具有特定模式的行。我尝试在浴缸中打开文件并通过正则表达式提取行。由于文件太大,性能对我来说很重要。因此,我管理了以下模式:
import re
start = time.time()
s = re.findall('1167331td{4,}', file)
middle = time.time()
s2 = re.findall('d{4,}t1167331', file)
end = time.time()
print(end - middle, middle - start)
结果:
87.53701615333557 1.5457119941711426
差异的原因是什么?我该如何解决这个问题? 我认为正则表达式从模式的开始到结束,所以第一个模式会更快。正如文档所断言的:
将字符串中模式的所有非重叠匹配项作为字符串列表返回。从左到右扫描字符串,并按找到的顺序返回匹配项。
如果它是正确的,有没有办法想出这个?是否可以强制正则表达式从右到左匹配?这篇文章中的一个答案说.NET中有。 我的一部分数据:
file[:200]
'1000061t11172522n1000211t1084791n1000211t1087381n1000211t1113071n1000211t1167331n1000211t5997662n1000211t7006722n1000211t7763732n1000211t13075162n1000211t13550632n1000211t14367563n1000211t14373036n100'
您的正则表达式之所以如此,d{4,}
可以匹配许多不同的组合,如果t
后面的数字无效,它必须检查它们。假设我们有:
1000211t875349678t1000211
如果d{4}
排在第一位,并且t
后面的数字不1167331
,它必须检查1000211t
、000211t
、00211t
、0211t
,然后才能确定超过t
的数字无效。想象一下,如果你的数字更长 - 在移动到下一个之前,它必须检查更多的内容!更糟糕的是,如果t
后面的数字几乎有效,它也会检查所有这些字符,运行时间更长。
如果1167331
排在第一位,则只需在失败并移动到下一个数字之前检查10
。
查看慢速和快速正则表达式的调试器逐步介绍 - 您将很快看到区别是什么。