Python の re.finditer 関数と for を使った繰り返しパターンマッチ
re.match() 関数や re.search() 関数では複数のマッチが取れない
match() 関数や search() 関数ではパターンがマッチした場合、最初のマッチオブジェクトが返ります。
例えば、次のように「複数文字列の中で Hello に続く文字」を取得したいとします。そこで、次のようなコードを書いたとします。
import re
s = """abc
Hello world!
Hello Python!
xyz"""
match = re.search(r'^Hello (.*)$', s, re.MULTILINE)
if match is None:
print('Not match')
else:
print(match.groups())
この実行結果は次のようになります。
('world!',)
world! は取得できていますが、その次の行の Python! は取得できていません。
2個目以降のマッチオブジェクトを取得するためには、どうしたら良いでしょうか。
re.finditer() 関数と for ループを使って繰り返しパターンマッチを行う
繰り返しのマッチを行う場合には finditer() 関数を用いて、次のように連続的にマッチオブジェクトを取得することができます。
import re
s = """abc
Hello world!
Hello Python!
xyz"""
for m in re.finditer(r'^Hello (.*)$', s, re.MULTILINE):
print(m.groups())
この実行結果は次の通りです。
('world!',)
('Python!',)
確かにパターンマッチするはずの箇所、二つともとれています。
ここでは re.finditer() 関数と for を用いた、 マッチの繰り返し処理の方法を説明しました。