パターンにマッチしたすべての文字列をリストで取得する(Pattern.findall)

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

(Last modified: )

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

Pattern クラスの findall メソッドは、対象の文字列の中でパターンにマッチしたすべての文字列をリストとして取得します。書式は次の通りです。

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

1 番目の引数に対象の文字列を指定します。文字列の先頭から順にパターンがマッチするかどうかを調べていき、マッチしたすべての文字列をリストとして返します。マッチしなかった場合は空のリストを返します。

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

findall メソッドはマッチした文字列を要素として持つリストを返します。次のサンプルを見てください。

import re

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

result = pattern.findall(msg)

if (len(result) == 0):
    print('Don\'t matched')
else:
    for s in result:
        print(s)

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

今回のサンプルでは対象の文字列の中で 3 箇所でパターンとマッチします。マッチした文字列が含まれるリストから for 文を使って順に要素を取り出しました。マッチしなかった場合は空のリストが返されるので len 関数を使って要素数が 0 の場合はマッチしなかったものとして処理しています。

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

パターンにキャプチャグループが設定されている場合、キャプチャグループ毎にマッチした文字列を要素として持つタプルのリストを返します。次のサンプルを見てください。

import re

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

result = pattern.findall(msg)

if (len(result) == 0):
    print('Don\'t matched')
else:
    for s in result:
        print(s)

>> ('MA', '52')
>> ('JO', '72')
>> ('PP', '45')

今回のサンプルではパターンの中に 2 つのキャプチャグループが設定されています。その為、マッチするごとにキャプチャグループ毎にマッチした文字列を要素とするタプルを取得し、そのタプルを要素とするリストを最終的に取得しています。

-- --

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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