mei_13のPython講座 ロゴ

【Pythonコラム】Pythonの頼れる相棒! re.findall() を徹底解説




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でのテキスト処理をレベルアップさせてください!



< Pillow
コラム一覧に戻る
sprintf()スタイル >

レッスン概要

◯月額4,000円で質問し放題!!
◯完全オンライン
◯翌日までには必ず返信
◯挫折しない独自の学習メソッド
◯圧倒的高評価!!
◯テキストベースで時間を選ばない
◯高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!