Python: 正規表現でマッチした文字列をリストとして取得 re.findall()
Pythonの正規表現で、
マッチしたすべての文字列をリストとして取得するには、
reモジュールのfindall()関数を使います。
ここではfindall()関数の使い方を解説します。
findall()の書式
書式
findall(検索パターン, 検索対象文字列 [, flags=0])
引数の指定方法はsearch()関数やmatch()関数と同じように、 検索パターン、検索対象文字列の順番で指定します。
大きく異なるのは戻り値です。 search()関数は最初にマッチした文字列のMatchオブジェクトを 返しますが、findall()関数はマッチしたすべての文字列をリストとして返します。 マッチしなかった場合は空のリストが戻ります。
findall()のサンプルコード
次のサンプルコードでは、HTMLの li 要素の内容を取得して リストとして受け取ります。
import re # パターン p = "<li>(.*?)</li>" # 検索対象文字列 s = """<ul> <li>リストA</li> <li>リストB</li> <li>リストC</li> </ul> """ # 検索 li = re.findall(p, s) print(li)
実行結果
['リストA', 'リストB', 'リストC']
このように、 findall()関数を実行するだけでマッチ内容がリストとして取得できます。 この後に何らかの処理をする場合も扱いやすいので、 複数マッチする場合は findall()関数がおすすめです。
複数のグループを指定した場合
findall()関数のパターン検索に複数のグループを指定した場合、 タプルのリストを返します。
次のサンプルコードでは、
郵便番号のような数値を3桁のグループと4桁のグループに分けて
パターン検索しています。
実行結果を見ると、それぞれのグループをタプルとしたタプルのリストが
戻っています。
import re # パターン p = "(\d{3})-(\d{4})" # 検索対象文字列 s = """123-4567 890-1234 567-8901 """ # 検索 li = re.findall(p, s) print(li)
実行結果
[('123', '4567'), ('890', '1234'), ('567', '8901')]