複数のファイルがあり、それぞれのファイルで一連の単語を検索しています。
私の正規表現は基本的に、単語 1 の後に単語 2 が続き、単語 3 が続くシーケンスを検索します。したがって、式は次のようになります。
strings = re.findall('word1.*?word2.*?word3', f.read(), re.DOTALL)
20kb 未満のファイルの場合、式はかなりうまく実行されます。ただし、20 kb を超えるファイルでは実行時間が指数関数的に増加し、100 kb に近いファイルではプロセスが完全にハングします。(以前のスレッドを読んだ後) 問題は .* を re.DOTALL と組み合わせて使用することに関係しているように見えます-「壊滅的なバックトラッキング」につながります。推奨される解決策は、ファイル全体を 1 つのメモリ バッファーに読み込むのではなく、1 行ずつ入力ファイルを提供することでした。
しかし、私の入力ファイルはランダムな空白と "\n" 改行文字でいっぱいです。私の単語シーケンスも長く、複数の行にまたがっています。したがって、ファイル全体を re.DOTALL と組み合わせて正規表現に入力する必要があります。そうしないと、行ごとの検索でシーケンスが見つかりません。
それを回避する方法はありますか?