Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Python辞典

  1. トップページ
  2. Python辞典
  3. re.findall() / re.finditer()

re.findall() / re.finditer()

正規表現を使って文字列からパターンに一致する全ての部分を取り出す関数です。『re.findall()』はリストを返し、『re.finditer()』はマッチオブジェクトのイテレータを返します。

構文
import re

# パターンに一致する全ての文字列をリストで返します。
マッチリスト = re.findall(パターン, 文字列)

# パターンに一致する全てのマッチオブジェクトをイテレータで返します。
for m in re.finditer(パターン, 文字列):
    print(m.group())
    print(m.start(), m.end())  # マッチした位置も取得できます。
関数一覧
関数概要
re.findall(pattern, string)パターンに一致する全ての文字列をリストで返します。キャプチャグループがある場合はグループの内容のリストを返します。マッチが1つもない場合は空のリストを返します。
re.finditer(pattern, string)パターンに一致する全てのマッチオブジェクトをイテレータで返します。各オブジェクトからマッチ位置やグループを取得できます。
サンプルコード
import re

# findall() で全ての数値を抽出します。
text = '商品A: 1200円、商品B: 850円、商品C: 3000円'
prices = re.findall(r'\d+', text)
print(prices)  # 『['1200', '850', '3000']』と出力されます。

# 合計を計算します。
total = sum(int(p) for p in prices)
print(f'合計: {total}円')  # 『合計: 5050円』と出力されます。

# キャプチャグループがある場合はグループの内容を返します。
html = '<a href="https://example.com">サイト1</a> <a href="https://test.jp">サイト2</a>'
urls = re.findall(r'href="([^"]+)"', html)
print(urls)  # 『['https://example.com', 'https://test.jp']』と出力されます。

# 複数グループがある場合はタプルのリストを返します。
log = '2025-04-01 ERROR: timeout\n2025-04-02 INFO: started\n2025-04-03 ERROR: crash'
errors = re.findall(r'(\d{4}-\d{2}-\d{2}) (ERROR): (.+)', log)
print(errors)
# 『[('2025-04-01', 'ERROR', 'timeout'), ('2025-04-03', 'ERROR', 'crash')]』と出力されます。

# finditer() でマッチ位置も取得します。
text2 = 'appleとorangeとbanana'
for m in re.finditer(r'[a-z]+', text2):
    print(f'{m.group()} (位置: {m.start()}-{m.end()})')
# それぞれのアルファベット単語とその位置が出力されます。

# finditer() は大きなテキストでもメモリ効率が良いです。
big_text = 'A1 B2 C3 D4 E5 ' * 10000
count = sum(1 for _ in re.finditer(r'[A-Z]\d', big_text))
print(f'マッチ数: {count}')  # 『マッチ数: 50000』と出力されます。
概要

『re.findall()』はシンプルにマッチした文字列のリストが欲しい場合に使います。キャプチャグループの有無によって戻り値の形式が変わります。グループがない場合は文字列のリスト、グループが1つある場合はグループの文字列のリスト、グループが複数ある場合はタプルのリストになります。

『re.finditer()』はマッチオブジェクトのイテレータを返すため、マッチした文字列だけでなく位置情報(『start()』・『end()』)やキャプチャグループも同時に取得できます。また結果をすべてメモリに保持せずに1件ずつ処理するため、大量のマッチがある場合は『findall()』よりもメモリ効率が良いです。

パターンに一致する部分が重複する場合、前のマッチが終わった位置から次の検索が始まるため、重複マッチは取得できません。重複マッチが必要な場合は先読みアサーション(lookahead)を使ってください。

単一マッチの検索は『re.match() / re.search() / re.fullmatch()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。