長い文字列(65,535文字)と照合しようとしているやや複雑な正規表現があります。私は、文字列のreの複数の出現を探しています、そしてfinditerを使用しています。それは動作しますが、何らかの理由で最初の数回の発生を特定した後にハングします。なぜ誰がこのことが分かっているのですか?ここでは、コードスニペットがあります:長い文字列と照合するときに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())
これは、最初の4つの発生を出力しますが、それがハングアップします。私は、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
私は単純に再でそれをしようとすると、それが正常に動作します。
私はこれをWindows XPのCygwin上で動作するPython 2.5.4で実行しています。
私は非常に短い文字列でハングすることができました。
ddddddeddbedddbdddddddddddddddddddddddd
そして、これと:それは返す(そしてマッチを表示しない)のに約15秒かかった。この39文字の文字列で
ddddddeddbedddbddddddddddddddddddddddddddddddddddd
:この50文字の文字列で、それは、約5分後に返されることはありませんそれはすぐに返す文字列:
ddddddeddbedddbdddddddddddddd
ありがとう - それは非常に役立ちます。私は|ちょうどいくつかの別々のregexesを持つことによって。私はd *の削除に関する新しい質問をするかもしれません - 私は基本的に任意の位置に 'd'を受け入れることを正規表現したい。 – Ben
@Ben:パターンをテストする前に文字列からdを取り除くだけです。 – Gumbo
@ガンボ:ああ!はい。私はそれを試みた。残念ながら、私は一致が発生する元の文字列内の正確な位置を知る必要があります。 – Ben