正则表达式时间在模式的反向版本中有很大不同



我想在一个大的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,它必须检查1000211t000211t00211t0211t,然后才能确定超过t的数字无效。想象一下,如果你的数字更长 - 在移动到下一个之前,它必须检查更多的内容!更糟糕的是,如果t后面的数字几乎有效,它也会检查所有这些字符,运行时间更长。

如果1167331排在第一位,则只需在失败并移动到下一个数字之前检查10

查看慢速和快速正则表达式的调试器逐步介绍 - 您将很快看到区别是什么。

相关内容

最新更新