🐍 Python

re.findall(pattern, string, flags=0)

パターンに一致する部分をすべてリストで取得する関数です。re.searchが最初の1件しか返さないのに対し、re.findallは文字列中の一致箇所を残らず集めてくれます。ログから数値をすべて抜き出す、文章から特定のパターンをすべて列挙する、といった場面でよく使われます。

構文: re.findall(pattern, string, flags=0)
戻り値: 一致した文字列のリスト(パターンにグループがあればタプルのリスト)

基本の使い方:数字をすべて抜き出す

文字列中に散らばった数字をまとめてリストで取得します。

import re

print(re.findall(r'\d+', 'a1b22c333'))  # ['1', '22', '333']

グループがあるとタプルのリストになる

ここがre.findallで最も間違えやすいポイントです。パターンに(...)のグループが含まれていると、戻り値は一致した文字列そのものではなく、グループごとの値をまとめたタプルのリストになります。この挙動を知らないと、AIが生成したコードの戻り値の形がなぜ変わるのか分からなくなります。

import re

# グループなし: 一致した文字列そのもののリスト
print(re.findall(r'\d+', 'x=1 y=22 z=333'))
# ['1', '22', '333']

# グループあり: (キー, 値) のタプルのリストになる
print(re.findall(r'(\w+)=(\d+)', 'x=1 y=22 z=333'))
# [('x', '1'), ('y', '22'), ('z', '333')]

母音だけを抜き出す例

文字クラス[...]を使って、指定した文字のどれかに一致する箇所をすべて集める例です。

import re

print(re.findall(r'[aeiou]', 'hello world'))
# ['e', 'o', 'o']
パラメータ
pattern
検索する正規表現パターン(文字列)。raw文字列r'...'で書くのが基本
string
検索対象の文字列
flags(省略可)
動作オプション。詳しくはflagsのページを参照
💡 位置情報も欲しいならfinditer

re.findallは一致した文字列(またはグループのタプル)しか返さないため、「何文字目で見つかったか」という位置情報は分かりません。位置情報や、一致ごとにMatchオブジェクトとして細かく扱いたい場合はre.finditerを使います。単純に一致した値の一覧が欲しいだけならfindallのほうがシンプルに書けます。

← Python re モジュール リファレンス一覧へ戻る