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')]
Python