Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】正規表現に一致するすべての文字列を抽出する方法|re.findallとre.finditerの使い分け

Pythonで正規表現に一致するすべての箇所を取得したい場合は、標準ライブラリ re モジュールが提供する re.findall() または re.finditer() を使用します。この2つのメソッドは似た用途で使われますが、戻り値が異なるため、目的に応じて使い分けることが重要です。

re.findall():マッチした文字列をリストで返す

re.findall(pattern, string) は、文字列内でパターンに一致したすべての部分をリストとして返します。シンプルに「一致した文字列の一覧」が欲しい場合に最適です。

import re

text = "apple banana apple cherry apple"
result = re.findall(r"apple", text)
print(result)  # ['apple', 'apple', 'apple']
print(len(result))  # 3

また、パターンにキャプチャグループ () を含めると、グループ内の文字列だけがリストに格納されます。

text = "2024-01-15, 2023-12-31"
dates = re.findall(r"(\d{4})-(\d{2})-(\d{2})", text)
print(dates)  # [('2024', '01', '15'), ('2023', '12', '31')]

re.finditer():マッチオブジェクトのイテレータを返す

re.finditer(pattern, string) は、Matchオブジェクトのイテレータを返します。マッチした位置情報や、より詳細な情報が必要な場合に便利です。

import re

text = "apple banana apple cherry"
for m in re.finditer(r"apple", text):
    print(f"一致位置: {m.start()}〜{m.end()}, 文字列: {m.group()}")
# 一致位置: 0〜5, 文字列: apple
# 一致位置: 13〜18, 文字列: apple

Matchオブジェクトからは、group()(一致した文字列)、start()end()(開始・終了位置)、span()(位置のタプル)などの情報を取得できます。

どちらを使うべきか?

  • re.findall():一致した文字列そのものだけが必要な場合。コードが簡潔になる。
  • re.finditer():一致位置や詳細なマッチ情報が必要な場合、または大量のデータを逐次処理してメモリ効率を重視したい場合。

なお、1件だけ見つければ十分な場合は re.search()、文字列の先頭から判定したい場合は re.match() を使うとよいでしょう。

  1. 【初心者向け】Python正規表現のグループ化の仕組みと使い方を徹底解説

    グループ化とは正規表現における「グループ化」とは、パターンの一部を丸括弧 () で囲むことです。これにより、単一の文字だけでなく、グループ全体に対して量指定子(*、+ など)や各種演算子を適用できるようになります。キャプチャグループと後方参照丸括弧には、部分式をひとまとめにする役割に加えて、「キャプチャグループ」を作成する働きもあります。グループ化された部分がマッチした文字列は「後方参照(バックリファレンス)」として保存され、あとから再利用することが可能です。実際の開発では、2つ以上の候補のどれかにマッチする正規表現が必要になる場面が多くあります。また、量指定子を複数の式全体に適用したいケース

  2. Pythonの正規表現における修飾子(フラグ)の使い方と機能一覧

    Python正規表現の修飾子とはPythonのreモジュールでは、正規表現によるパターンマッチングの挙動を制御するために、さまざまな修飾子(フラグ)を指定することができます。これらの修飾子を使うことで、大文字小文字の区別や改行の扱いなど、マッチングの動作を柔軟に変更できます。以下に、主要な修飾子とその機能を一覧形式で紹介します。1. re.I(re.IGNORECASE)大文字と小文字を区別せずにマッチングを行います。英字の大小を無視したい場合に便利です。2. re.L(re.LOCALE)現在のロケール設定に従って単語を解釈します。このフラグは、アルファベット系のグループ(\w および \W