Python 入門

ホーム > 正規表現 > 繰り返しマッチは finditer が便利

繰り返しマッチは finditer が便利

match 関数や search 関数ではマッチした場合、最初のマッチオブジェクトが返ります。

例えば、次のように検索したい文字列の中で Hello に続く文字を拾って来たいとして次のようなコードを書いたとします。

import re

s = """xxxxx
Hello spam!
Hello Python!
yyyyy"""

match = re.search(r'^Hello (.*)$', s, re.MULTILINE)

if match is None:
	print 'Not match'
else:
	print match.groups()

これを実行すると、次のように spam! という箇所のマッチが拾えていることが分かります。

('spam!',)

検索対象の文字列には、その他 Hello Python! という箇所もありますから、"Python!" という部分も拾うために、 再度 search することになります。

こうした繰り返し、マッチを行う場合には finditer を使って、次のように連続的にマッチオブジェクトを取得することが可能です。

import re

s = """xxxxx
Hello spam!
Hello Python!
yyyyy"""

match = re.search(r'^Hello (.*)$', s, re.MULTILINE)

for m in re.finditer(r'^Hello (.*)$', s, re.MULTILINE):
	print m.groups()

実行結果は次の通り。

('spam!',)
('Python!',)

確かに二つともとれています。

プログラミングの常でもありますが、正規表現の場合はとくに、いろいろな実装方法がありますので、好きな方法で実装すればいいとおもいますが、 いろいろなツールや関数、ライブラリを駆使することが大切ですよね。

ホーム > 正規表現 > 繰り返しマッチは finditer が便利