いくつかの単語の存在を検索するための正規表現を記述したいのですが、出現順序は重要ではありません。
たとえば、「Tim」と「stupid」を検索します。私の正規表現は ですTim.*stupid|stupid.*Tim
。しかし、もっと単純な正規表現を書くことは可能ですか (たとえば、正規表現自体に 2 つの単語が 1 回だけ表示されるようにするなど)?
ベストアンサー1
次の正規表現を参照してください:
/^(?=.*Tim)(?=.*stupid).+/
正規表現の説明:
^
文字列の先頭の位置をアサートします。(?=.*Tim)
文字列に「Tim」が存在することを確認します。(?=.*stupid)
文字列に「stupid」が存在することをアサートします。.+
フレーズが存在するので、この文字列は有効です。先に進み、.+
または -を使用して.++
文字列全体を一致させます。
先読みをより排他的に使用するには、別のグループを追加します(?=.*<to_assert>)
。正規表現全体を次のように簡略化できます/^(?=.*Tim).*stupid/
。
見る正規表現のデモ!
>>> import re
>>> str ="""
... Tim is so stupid.
... stupid Tim!
... Tim foobar barfoo.
... Where is Tim?"""
>>> m = re.findall(r'^(?=.*Tim)(?=.*stupid).+$', str, re.MULTILINE)
>>> m
['Tim is so stupid.', 'stupid Tim!']
>>> m = re.findall(r'^(?=.*Tim).*stupid', str, re.MULTILINE)
>>> m
['Tim is so stupid.', 'stupid Tim!']
続きを読む: