Pythonの頼れる相棒! re.findall() を徹底解説
Pythonで文字列を扱う際、特定のパターンに一致する部分を効率的に見つけ出すことは非常に重要です。そんな時に頼りになるのが、re
モジュールの findall()
関数です。今回は、この findall()
を初心者の方にもわかりやすく、じっくりと解説していきます。
re.findall() とは?
re.findall()
は、正規表現を使って文字列を検索し、パターンに一致するすべての部分文字列をリストとして返してくれる便利な関数です。一箇所だけでなく、複数箇所にマッチする可能性がある場合に特に力を発揮します。
基本的な構文:
import re
re.findall(pattern, string, flags=0)
- pattern: 検索したい正規表現パターンを文字列で指定します。
- string: 検索対象となる文字列です。
- flags: (オプション) 正規表現の動作を制御するためのフラグです。例えば、大文字・小文字を区別しない
re.IGNORECASE
などがあります。
具体的な使用例で理解を深める
百聞は一見にしかず。実際にコードを見てみましょう。
import re
text = "私はリンゴが大好きです。隣の家の人はオレンジが好きらしい。"
# 'リンゴ'という単語を検索
result = re.findall("リンゴ", text)
print(result) # 出力: ['リンゴ']
# '好き'という単語を検索
result = re.findall("好き", text)
print(result) # 出力: ['好き', '好き']
# 数値 (0-9) を検索
text = "値段は1000円です。割引で500円になります。"
result = re.findall(r"\d+", text) # \d+ は1つ以上の数字を表す正規表現
print(result) # 出力: ['1000', '500']
この例からわかるように、findall()
は文字列の中から指定したパターンに一致する部分をすべて見つけ出し、リストとして返してくれます。 正規表現 \d+
は、1つ以上の連続する数字を表すメタ文字です。 r""
は raw string リテラルといい、バックスラッシュ \
をエスケープシーケンスとして解釈しないため、正規表現を記述する際に便利です。
グループ化とfindall()
正規表現では、 ()
で囲むことで、パターンの一部をグループ化できます。 findall()
をグループ化されたパターンで使用すると、返されるリストの内容が少し変わります。
- グループがない場合: パターン全体に一致する文字列のリストが返されます。
- グループが1つだけの場合: そのグループに一致する文字列のリストが返されます。
- 複数のグループがある場合: 各マッチに対して、グループに一致する文字列のタプルがリストとして返されます。
例を見てみましょう。
import re
text = "私の電話番号は090-1234-5678です。友人の電話番号は080-9876-5432です。"
# 電話番号全体を検索
result = re.findall(r"\d{3}-\d{4}-\d{4}", text)
print(result) # 出力: ['090-1234-5678', '080-9876-5432']
# 電話番号の市外局番だけを検索 (グループ化)
result = re.findall(r"(\d{3})-\d{4}-\d{4}", text)
print(result) # 出力: ['090', '080']
# 電話番号の市外局番、市内局番、番号をそれぞれグループ化
result = re.findall(r"(\d{3})-(\d{4})-(\d{4})", text)
print(result) # 出力: [('090', '1234', '5678'), ('080', '9876', '5432')]
このように、グループ化を使うことで、必要な情報を効率的に抽出できます。
フラグを使って検索をカスタマイズ
flags
引数を使うことで、正規表現の検索動作をカスタマイズできます。よく使われるフラグをいくつか紹介します。
- re.IGNORECASE (または re.I): 大文字・小文字を区別せずに検索します。
- re.MULTILINE (または re.M): 文字列を複数行として扱い、
^
と$
が各行の先頭と末尾にマッチするようにします。 - re.DOTALL (または re.S):
.
が改行文字にもマッチするようにします。
例:
import re
text = "Hello World\nhello world"
# 大文字・小文字を区別せずに 'hello' を検索
result = re.findall("hello", text, re.IGNORECASE)
print(result) # 出力: ['Hello', 'hello']
# 複数行モードで各行の先頭の単語を検索
text = "Apple\nBanana\nOrange"
result = re.findall(r"^\w+", text, re.MULTILINE) # ^ は行の先頭, \w+ は単語
print(result) # 出力: ['Apple', 'Banana', 'Orange']
まとめ
re.findall()
は、正規表現を使って文字列から必要な情報を抽出するための強力なツールです。 基本的な使い方から、グループ化、フラグの活用まで、様々な機能を理解することで、より効率的かつ柔軟な文字列処理が可能になります。ぜひ、re.findall()
を使いこなして、Pythonでのテキスト処理をレベルアップさせてください!