У меня есть несколько сложное регулярное выражение, которое я пытаюсь сопоставить с длинной строкой (65 535 символов). Я ищу несколько вхождений re в строке, и поэтому я использую finditer. Это работает, но по какой-то причине зависает после определения первых нескольких случаев. Кто-нибудь знает, почему это может быть? Вот фрагмент кода:
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
Если я попробую его с более простой ре, он отлично работает.
Я запускаю это на python 2.5.4, работающем на Cygwin под Windows XP.
Мне удалось заставить его висеть на очень короткой струне. С этой строкой из 50 символов она не возвращается через 5 минут:
ddddddeddbedddbddddddddddddddddddddddddddddddddddd
Для этой 39-символьной строки потребовалось около 15 секунд, чтобы вернуться (и не отобразить совпадений):
ddddddeddbedddbdddddddddddddddddddddddd
И с этой строкой она мгновенно возвращается:
ddddddeddbedddbdddddddddddddd