パターンにマッチしたすべての文字列をリストで取得する(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 )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。