ドキュメント内の複数のn-gramに一致する正規表現を実行しようとしています。最初にn-gramのリストを取得し、次のように正規表現にコンパイルします。
sNgrams = '|'.join(('\s+'.join(re.escape(gram) for gram in nGram.split())) for nGram in aNgrams)
(n-gramを任意の空白文字のトークンに分割し、これらのトークンを再エスケープして'\ s +'-esで結合します(改行、ダブルスペース、タブなどでngramを一致させることができます)。正規表現に「|」が付いたn-gram)
私の正規表現は次のようになります。
reNgram = re.compile('(\A|\W+)(' + sNgrams + ')(?=\W+|\Z)',flags=re.UNICODE|re.IGNORECASE)
現在、これはほとんどの場合に正常に機能しますが、n-gramが別のn-gramとオーバーラップする場合、一致するものは1つだけです。
doc = 'aap noot mies'
aNgrams = ['aap','noot','aap noot']
sNgrams = 'aap|noot|aap\\s+noot'
re.findall(reNgram,doc)
[('', 'aap'), (' ', 'noot')]
aNgrams = ['mies','aap noot']
re.findall(reNgram,doc)
[('', 'aap noot'), (' ', 'mies')]
これを解決する方法はありますか?ドキュメント内で一致するすべての(サブ)文字列を返すには?
さらに、速度/効率は非常に重要です(私はこれらの正規表現を何万も発射しています)、最適化するために私ができることはありますか?「オンザフライ」でコンパイルされた正規表現はとにかくキャッシュされるため、正規表現の事前コンパイルはあまり効果がないことを読みましたが、これらの式を高速化するために実行できる(他の)明らかな手順はありますか?