Pythonで正規表現に一致するものをすべて見つけるにはどうすればよいですか?


312

私が書いているプログラムでは、Pythonにre.search()関数を使用してテキストブロック内の一致を検索し、結果を出力させています。ただし、プログラムは、テキストのブロックで最初に一致するものを見つけると終了します。

すべての一致が見つかるまでプログラムが停止しないところで、これを繰り返し行うにはどうすればよいですか?これを行う別の機能はありますか?


再帰的なREは別の獣です。検索を繰り返したい。
Outis

回答:


545

re.findallまたはre.finditer代わりに使用します。

re.findall(pattern, string) 一致する文字列のリストを返します。

re.finditer(pattern, string)MatchObjectオブジェクトのイテレータを返します。

例:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']

18
finditer私が探していたものでした。1つがMatchオブジェクトと他の文字列を返すことに驚いています。match_allまたはmatch_iter関数を使用することを期待していました。
dsclose

21
免責事項:それらは重複しない一致のみを見つけます
AntoineLizéeSep

3
@AntoineLizée、重複のある反復をどのように見つけるのですか?
ラクシャ2017年

16
@Raksha- re.searchループで使用します。Matchオブジェクトを返します。ループの次の反復の引数Match.start() + 1として渡す必要があります。posre.search
ArtOfWarfare 2017年

3
一致に複数のグループが含まれている場合、findallは一致する文字列のリストではなく、一致するタプルのリストを返します。
ロドルガス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.