いくつかの単語の存在を検索するための正規表現を書きたいのですが、それらの出現順序は重要ではありません。
たとえば、「Tim」と「stupid」を検索します。私の正規表現はTim.*stupid|stupid.*Tim
。しかし、より単純な正規表現を作成することは可能ですか(たとえば、2つの単語が正規表現自体に1回だけ表示されるように)?
この正規表現を参照してください:
_/^(?=.*Tim)(?=.*stupid).+/
_
正規表現の説明:
^
_文字列の先頭の位置をアサートします。(?=.*Tim)
_文字列に「Tim」が含まれていることを表明します。(?=.*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!']
_
続きを読む:
Positive Lookaheadを使用してこれを実現できます。先読みアプローチは、順序に関係なく両方の部分文字列を含む文字列を照合するのに適しています。
pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$')
例:
>>> s = '''Hey there stupid, hey there Tim
Hi Tim, this is stupid
Hi Tim, this is great'''
...
>>> import re
>>> pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$', re.M)
>>> pattern.findall(s)
# ['Hey there stupid, hey there Tim', 'Hi Tim, this is stupid']