re.match / re.search / re.fullmatch / re.findall の違い

テクニック

Python の正規表現は、似たような関数がいくつもあります。
ここではよく使う4つの関数の違いを整理しておきましょう。


1. re.match

「文字列の先頭でマッチするか?」 を確認します。

import re
text = "Endpoint: U5/D"

print(re.match(r"Endpoint", text))   # ✅ マッチ(先頭が 'Endpoint')
print(re.match(r"U5", text))         # ❌ None(先頭は 'Endpoint')

👉 必ず先頭にあるかどうかだけを調べます。
ログやレポートの「行頭のキーワード」を拾うのに便利です。


2. re.search

「文字列のどこかにマッチするか?」 を確認します。

text = "Endpoint: U5/D"

print(re.search(r"Endpoint", text))  # ✅ 先頭にあるのでマッチ
print(re.search(r"U5", text))        # ✅ 中間にあるのでマッチ

👉 行の途中に出てくる文字列も探せるのが re.search
パターンが文字列のどこにあるかわからない時はこちらを使います。


3. re.fullmatch

「文字列全体がパターンと一致するか?」 を確認します。

text = "Endpoint: U5/D"

print(re.fullmatch(r"Endpoint: U5/D", text))  # ✅ 全体一致
print(re.fullmatch(r"Endpoint", text))        # ❌ 部分一致はNG

👉 「1行丸ごとがこの形式か?」を確認したいときに使います。
(例:数値だけの行を検出する、日付フォーマットを検証する 等)


4. re.findall

「パターンに一致した部分をすべてリストで返す」

text = "slack = 0.11 ns, slack = -0.05 ns"

print(re.findall(r"-?\d+\.\d+", text))
# 👉 ['0.11', '-0.05']

👉 「数値を全部抜き出したい」「メールアドレスを一括抽出したい」などに便利です。


5. まとめ表

関数どこを調べる?戻り値
re.match文字列の 先頭最初にマッチした部分 or None
re.search文字列の どこか最初にマッチした部分 or None
re.fullmatch文字列 全体一致した部分 or None
re.findall文字列の 全部から複数一致一致部分のリスト

6. 使い分けの目安

  • 行頭のキーワード検出re.match
  • 行中の任意位置で検索re.search
  • 入力全体がルール通りか確認re.fullmatch
  • 複数の値を一括抽出re.findall

💡 ポイント

  • re.match は「行頭専用」、re.search は「どこでも探す」
  • re.fullmatch は「全体一致かどうか」
  • re.findall は「全部抜き出し」。

この4つを覚えれば、Timing Report の解析はもちろん、ログ解析やフォーマット検証など幅広く応用できます!
また、これらの動作は、都度compileするため、巨大なファイルを扱う場合は動作が遅くなりがちです。改善には、この記事を参照してみてください!

タイトルとURLをコピーしました