🐍 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のほうがシンプルに書けます。