Python | 正規表現テンプレート集

Python
スポンサーリンク

概要

Pythonで正規表現を使うと文字列から「特定のパターン」を探したり取り出したり置換したりできます。ここでは、よく使うパターンを「テンプレート」として集め、使い方(reモジュールの簡単なコード例)とポイントを初心者にもわかりやすくまとめます。


使い方の基本(最小コード)

  • import と簡単な関数の例
import re

text = "対象文字列"
pattern = r"ここに正規表現"

# 部分一致(最もよく使う)
m = re.search(pattern, text)
if m:
    print("見つかった:", m.group())

# 全件抽出
all_matches = re.findall(pattern, text)
print(all_matches)

# 置換
new_text = re.sub(pattern, "置換後", text)
print(new_text)
Python

よく使うメタ文字・記号(要点)

  • . 任意の1文字(改行を除く)
  • ^ 行頭、$ 行末
  • [] 文字クラス(例: [0-9], [a-zA-Z])
  • \d 数字、\w 単語文字(英数字と _ )、\s 空白文字
    • 1回以上、* 0回以上、? 0回か1回、{n,m} 回数指定
  • () グループ化、(?P<name>…) 名前つきグループ
  • ?:/?: 指定子や非捕獲グループ、(?=…) 前方参照(先読み)、(?!…) 否定先読み

テンプレート集(用途別)

各項に「用途」「正規表現」「Pythonでの使い方例」「ポイント」を示します。

1) メールアドレス(簡易)

  • 正規表現(テンプレート): r”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}”
  • 例:
pattern = r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"
emails = re.findall(pattern, text)
Python
  • ポイント: 実運用では非常に多様なケースがあり、これは「簡易チェック」用。

2) 日本の携帯電話(ハイフンあり)

  • 正規表現: r”\b0[789]0-\d{4}-\d{4}\b”
  • 例:
pattern = r"\b0[789]0-\d{4}-\d{4}\b"
phones = re.findall(pattern, text)
Python
  • ポイント: 固定のフォーマット(ハイフンあり)を想定。ハイフンなしは別パターン。

3) 一般的な電話番号(ハイフン任意)

  • 正規表現: r”\b0\d{1,4}-?\d{1,4}-?\d{4}\b”
  • 例:
pattern = r"\b0\d{1,4}-?\d{1,4}-?\d{4}\b"
phones = re.findall(pattern, text)
Python
  • ポイント: 可変長の市外局番などを許容する簡易版。

4) URL(http/https)

  • 正規表現: r”https?://[^\s/$.?#].[^\s]*”
  • 例:
pattern = r"https?://[^\s/$.?#].[^\s]*"
urls = re.findall(pattern, text)
Python
  • ポイント: シンプルな抽出用。厳密チェックではさらに細分化する。

5) 日付(YYYY-MM-DD)

  • 正規表現: r”\b(20\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])\b”
  • 例:
pattern = r"\b(20\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])\b"
dates = re.findall(pattern, text)  # タプル (年, 月, 日) が返る
Python
  • ポイント: 月・日の簡易バリデーションを含む。うるう年判定まではしない。

6) IPv4 アドレス(簡易)

  • 正規表現: r”\b(?:\d{1,3}.){3}\d{1,3}\b”
  • 例:
pattern = r"\b(?:\d{1,3}\.){3}\d{1,3}\b"
ips = re.findall(pattern, text)
Python
  • ポイント: 0〜255 の厳密チェックは別途必要。簡易抽出用。

7) 16進カラーコード(#RRGGBB)

  • 正規表現: r”#([A-Fa-f0-9]{6})\b”
  • 例:
pattern = r"#([A-Fa-f0-9]{6})\b"
colors = re.findall(pattern, text)  # キャプチャで6桁だけ取得
Python
  • ポイント: 先頭の # を含めたい場合は group を変える。

8) 数値(整数・符号付き)

  • 正規表現: r”[+-]?\d+”
  • 例:
pattern = r"[+-]?\d+"
nums = re.findall(pattern, text)
Python
  • ポイント: 浮動小数点が必要なら r”[+-]?\d+(?:.\d+)?”

9) 英単語(単語境界)

  • 正規表現: r”\b[a-zA-Z]+\b”
  • 例:
pattern = r"\b[a-zA-Z]+\b"
words = re.findall(pattern, text)
Python

グループ、名前つきグループ、先読みのテンプレート

  • キャプチャグループ: r”(\d{4})/(\d{2})/(\d{2})” → groups() で年/月/日を取得
  • 名前つきグループ: r”(?P\d{4})-(?P\d{2})-(?P\d{2})”
    • 取得: m.group(“year”)
  • 前方肯定先読み: r”(?<=ID:)\d+” → ID: に続く数字だけを抽出
  • 前方否定先読み: r”\b(?!The)\w+\b” → “The” で始まらない単語を抽出

例(名前つきグループ):

pattern = r"(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})"
m = re.search(pattern, text)
if m:
    print(m.group("year"), m.group("month"), m.group("day"))
Python

フラグとマルチライン処理

  • re.I / re.IGNORECASE 大文字小文字を無視
  • re.M / re.MULTILINE ^ と $ を行ごとにマッチ
  • re.S / re.DOTALL . が改行にもマッチする
  • 例: re.search(pattern, text, flags=re.I|re.M)
m = re.search(r"^error:", text, flags=re.I|re.M)
Python

テスト用ワンライナー(確認スニペット)

  • マッチ確認:
import re
print(bool(re.search(r"pattern", "対象文字列")))
Python
  • グループ取得:
m = re.search(r"(\d{3})-(\d{4})-(\d{4})", "090-1234-5678")
if m:
    print(m.groups())  # ('090','1234','5678')
Python

よくある注意点とコツ

  • 生の文字列 r”…” を使う(バックスラッシュをそのまま扱える)
  • 「簡易テンプレート」は万能ではない。実運用なら境界ケースを考慮して調整する
  • 抽出後に型変換(int化、日付化)や追加のバリデーションを行う
  • 長い正規表現はコメント付きで re.VERBOSE を使うと読みやすい

例(VERBOSE):

pattern = re.compile(r"""
    ^            # 行頭
    (?:\+81|0)   # 国番号 or 0
    \d{1,4}      # 市外局番
    -?
    \d{1,4}
    -?
    \d{4}
    $            # 行末
""", re.VERBOSE)
Python

練習課題(実践で慣れる)

  1. テキストからすべてのメールアドレスを取り出すコードを書いて実行する。
  2. ログファイルから “ERROR: ” で始まる行だけを抽出する(re.M を利用)。
  3. テキスト中の yyyy/mm/dd 形式の日付を見つけて、年だけをリストにする。
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました