【Python】正規表現re.findallで特定のパターンを含む文字列をすべて抽出する方法

Pythonを用いてログ解析やテキストマイニングを行う際、「ある特定のパターンに合致する部分をすべて抜き出したい」という場面は頻繁に訪れる。そのような場合、標準ライブラリである re モジュールの findall 関数を使用するのが最適である。

本記事では、re.search との違いや、メタ文字 .(ドット)を使った具体的な抽出テクニックについて、実用的なコード例を交えて詳しく解説する。

目次

re.findall とは

re.findall は、対象の文字列全体を走査し、正規表現パターンに一致するすべての箇所をリスト形式で返す関数である。

一方で、よく比較される re.search は「最初に一致した箇所」しか返さないという特性がある。したがって、テキスト内に点在するキーワードやデータを一括で取得したい場合は、迷わず findall を選択する必要がある。また、戻り値がリストであるため、後続の処理でループを回したり、要素数をカウントしたりする操作とも非常に相性が良い。

実装例:特定のプレフィックスを持つ文字列の抽出

ここでは、英文のテキストデータから、「t」で始まり、その直後に何らかの1文字が続くパターン(例: “th”, “ti”, “to” など)をすべて抽出するコードを紹介する。

サンプルコード

import re

def main():
    # 解析対象の英文テキスト
    # "曖昧さに直面したとしても、推測したいという誘惑を拒絶せよ" (The Zen of Pythonより)
    # 入力データのタイプミス(Inthe -> In the, timptation -> temptation)を修正済み
    text = "In the face of ambiguity, refuse the temptation to guess."

    # 正規表現パターンの定義
    # r"t." の解説:
    # "t" : 文字 "t" そのもの
    # "." : 改行以外の任意の1文字(メタ文字)
    # つまり、「tの後に何かが1文字続く」部分文字列にマッチする
    target_pattern = r"t."

    # 1. re.findall でマッチする箇所を全件取得
    # 戻り値は文字列のリストになる
    match_list = re.findall(target_pattern, text)

    # 結果の出力
    print("--- 抽出結果 ---")
    print(f"対象テキスト: {text}")
    print(f"検索パターン: {target_pattern}")
    print(f"検出数      : {len(match_list)}")
    print(f"抽出リスト  : {match_list}")

    # 2. 応用:より実践的な単語抽出(\w を使用)
    # "t"で始まり、アルファベットが1文字以上続く単語全体を抽出する場合
    # \w+ : 英数字とアンダースコアの1回以上の繰り返し
    word_pattern = r"t\w+"
    words = re.findall(word_pattern, text)
    print("\n--- 単語単位での抽出 ---")
    print(f"パターン    : {word_pattern}")
    print(f"抽出リスト  : {words}")

if __name__ == "__main__":
    main()

コードの解説とポイント

1. メタ文字 .(ドット)の役割

正規表現における . は、非常に強力なメタ文字である。これは「改行文字以外のあらゆる文字」にマッチするという性質を持つ。

上記のコード例 r"t." では、「t」の次に「空白スペース」がきても、「アルファベット」がきても、あるいは「記号」がきてもマッチする。具体的には、tempte や、theth などが該当する。この柔軟性は便利であるが、意図しない文字まで拾ってしまう可能性がある。そのため、より厳密な抽出を行いたい場合は、\w(英数字)や \d(数字)などを組み合わせて使用することが推奨される。

2. リスト内包表記との親和性

前述の通り、re.findall の戻り値は純粋なリスト(List)である。それゆえ、抽出した結果に対して、さらにPythonのリスト操作を行うことが容易である。

例えば、抽出した文字列をすべて大文字に変換したい場合、以下のように記述できる。

upper_matches = [m.upper() for m in match_list]

このように、正規表現で「粗く」抽出した後、Pythonの機能で「細かく」加工するというフローは、データ処理の現場で非常によく使われる手法である。

まとめ

re.findall は、テキストデータから必要な情報を一括で収集するための強力なツールである。

  • 全件抽出: テキスト内のすべての一致箇所をリストで取得できる。
  • メタ文字の活用: .\w を組み合わせることで、柔軟な検索条件を作れる。
  • データ加工: 戻り値がリストであるため、後続の処理につなげやすい。

ログファイルからのエラーコード収集や、スクレイピングデータの整形など、多岐にわたる場面で活用してほしい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次