パターンにマッチしたすべてのマッチオブジェクトを取得する(Pattern.finditer)

Pattern クラスの finditer メソッドは、対象の文字列の中でパターンとマッチしたすべてのマッチオブジェクトを取得するためのイテレータを取得します。ここでは Python の正規表現で finditer メソッドを使ってパターンにマッチしたすべてのマッチオブジェクトを取得する方法について解説します。

(Last modified: )

finditerメソッドの書式と使い方

Pattern クラスの finditer メソッドは、対象の文字列の中でパターンにマッチしたすべてのマッチオブジェクトを取得するためのイテレータを取得します。書式は次の通りです。

Pattern.finditer(string[, pos[, endpos]])

1 番目の引数に対象の文字列を指定します。文字列の先頭から順にパターンがマッチするかどうかを調べていき、マッチしたすべてのマッチオブジェクトを取得するためのイテレータを返します。

省略可能な 2 番目と 3 番目の引数には、対象の文字列の中でマッチするかどうかをチェックする範囲を指定します。 pos から endpos - 1 までが範囲となります。

finditer メソッドはマッチオブジェクトを取得するためのイテレータを返しますので、イテレータを使ってパターンにマッチしたマッチオブジェクトを順次取得することができます。次のサンプルを見てください。

import re

msg = 'MA-52, JO-72, PP-45'
pattern = re.compile(r'[A-Z]{2}-[0-9]{2}')

result = pattern.finditer(msg)

for m in result:
    print(m.group())

>> MA-52
>> JO-72
>> PP-45

今回のサンプルでは対象の文字列の中で 3 箇所でパターンとマッチします。マッチした部分に関するマッチオブジェクトを取得したら、 Match クラスのメソッドを使ってマッチした文字列を取得したりすることができます。今回のサンプルでは Match クラスの group メソッドを使ってマッチした文字列を取得しました。

※ マッチオブジェクトの詳しい利用方法については「マッチオブジェクトからマッチした文字列の情報を取得する(Match)」を参照されてください。

パターンにキャプチャグループが設定されている場合

パターンにキャプチャグループが設定されている場合、マッチオブジェクトからキャプチャグループにマッチした文字列を個別に取得することができます。次のサンプルを見てください。

import re

msg = 'MA-52, JO-72, PP-45'
pattern = re.compile(r'([A-Z]{2})-([0-9]{2})')

result = pattern.finditer(msg)

for m in result:
    print('Match:' + m.group(0))
    print('Group1:' + m.group(1))
    print('Group2:' + m.group(2))

>> Match:MA-52
>> Group1:MA
>> Group2:52
>> Match:JO-72
>> Group1:JO
>> Group2:72
>> Match:PP-45
>> Group1:PP
>> Group2:45

パターン全体にマッチした文字列を取得したあと、それぞれのキャプチャグループ毎にマッチした部分文字列を取得しました。

パターンにマッチしなかった場合の処理

finditer メソッドを使う場合は戻り値がイテレータとなります。もしマッチしなかった場合の処理を追加したい場合には例えば次のように行ってください。

import re

msg = 'Sample'
pattern = re.compile(r'[A-Z]{2}-[0-9]{2}')

result = pattern.finditer(msg)
m = None

for m in result:
    print(m.group())

if m is None:
    print('Don\'t matched')

>> Don't matched

イテレータを使って取り出したマッチオブジェクトを格納する変数に対して、あらかじめ None を設定しておきます。イテレーターからマッチオブジェクトを一つも取り出せなかった場合は変数の値は None のままなので if 文を使って変数の値を調べ、 None のままなら文字列がパターンにマッチしていないことになります。

-- --

Python の正規表現で findall メソッドを使ってマッチしたすべての文字列をリストで取得する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。