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するため、巨大なファイルを扱う場合は動作が遅くなりがちです。改善には、この記事を参照してみてください!