【发布时间】:2009-04-16 09:14:26
【问题描述】:
我有一个有点复杂的正则表达式,我试图匹配一个长字符串(65,535 个字符)。我正在寻找字符串中 re 的多次出现,因此我正在使用 finditer。它可以工作,但由于某种原因,它在识别出前几次出现后挂起。有谁知道这可能是为什么?这是sn-p的代码:
pattern = "(([ef]|([gh]d*(ad*[gh]d)*b))d*b([ef]d*b|d*)*c)"
matches = re.finditer(pattern, string)
for match in matches:
print "(%d-%d): %s" % (match.start(), match.end(), match.group())
它打印出前四次出现,但随后挂起。当我使用 Ctrl-C 杀死它时,它告诉我它在迭代器中被杀死:
Traceback (most recent call last):
File "code.py", line 133, in <module>
main(sys.argv[1:])
File "code.py", line 106, in main
for match in matches:
KeyboardInterrupt
如果我用更简单的 re 试试,效果很好。
我在 Windows XP 上的 Cygwin 上运行的 python 2.5.4 上运行它。
我设法让它用一个非常短的字符串挂起来。使用这 50 个字符的字符串,大约 5 分钟后它再也没有返回:
ddddddeddbedddbddddddddddddddddddddddddddddddddddd
使用这 39 个字符的字符串大约需要 15 秒才能返回(并且不显示匹配项):
ddddddeddbedddbdddddddddddddddddddddddd
使用这个字符串,它会立即返回:
ddddddeddbedddbdddddddddddddd
【问题讨论】:
标签: python regex performance