Python | 正規表現テンプレート集(raw 文字列版)

Python
スポンサーリンク

ここでは、先ほどの メール/電話/日付/URL/郵便番号 などを
ひとつの関数 validate(value, type) でまとめて使えるようにします。


コンセプト

  • type"email", "phone", "date", "url", "postal" を指定
  • 内部で re.VERBOSE + コメント付き正規表現を自動選択
  • True / False を返すだけでなく、分かりやすいメッセージも出力可能

完成コード:validate(value, type)

import re

# ===== 各種正規表現パターン =====
patterns = {
    "email": re.compile(r"""
        ^                       # 文字列の先頭
        [A-Za-z0-9._%+-]+       # ユーザー名
        @                       # @記号
        [A-Za-z0-9.-]+          # ドメイン名
        \.                      # ドット
        [A-Za-z]{2,}            # TLD(例: com, jp)
        $                       # 文字列の終わり
    """, re.VERBOSE),

    "phone": re.compile(r"""
        ^                             # 先頭
        0\d{1,4}                      # 市外局番(0で始まる)
        -?                            # ハイフン任意
        \d{1,4}                       # 市内局番
        -?                            # ハイフン任意
        \d{3,4}                       # 加入者番号
        $                             # 終わり
    """, re.VERBOSE),

    "date": re.compile(r"""
        ^                         # 先頭
        (19|20)\d{2}              # 西暦(1900〜2099)
        -                         # 区切り
        (0[1-9]|1[0-2])           # 月(01〜12)
        -                         # 区切り
        (0[1-9]|[12]\d|3[01])     # 日(01〜31)
        $                         # 終わり
    """, re.VERBOSE),

    "url": re.compile(r"""
        ^(https?|ftp)://            # プロトコル (http, https, ftp)
        [A-Za-z0-9.-]+              # ドメイン名
        (\.[A-Za-z]{2,})+           # トップレベルドメイン
        (:[0-9]{1,5})?              # ポート番号(任意)
        (/[A-Za-z0-9._~:/?#@!$&'()*+,;=%-]*)?  # パス(任意)
        $                           # 終わり
    """, re.VERBOSE),

    "postal": re.compile(r"""
        ^                # 先頭
        \d{3}            # 3桁の数字
        -?               # ハイフン(任意)
        \d{4}            # 4桁の数字
        $                # 終わり
    """, re.VERBOSE)
}

# ===== 汎用バリデーション関数 =====
def validate(value: str, type_: str, verbose: bool = True) -> bool:
    """
    指定されたタイプ(type_)の入力値(value)を正規表現で検証する。
    成功時は True、失敗時は False を返す。
    """
    pattern = patterns.get(type_)
    if not pattern:
        raise ValueError(f"未知のタイプです: {type_}")

    result = bool(pattern.match(value))

    if verbose:
        if result:
            print(f"✅ {type_} OK → {value}")
        else:
            print(f"❌ {type_} NG → {value}")

    return result
Python

使用例

# メール
validate("user@example.com", "email")
validate("bad@@mail", "email")

# 電話番号
validate("090-1234-5678", "phone")
validate("12345", "phone")

# 日付
validate("2025-11-02", "date")
validate("2025-13-40", "date")

# URL
validate("https://www.example.com/path", "url")
validate("htp://bad_url", "url")

# 郵便番号
validate("100-0001", "postal")
validate("12-345", "postal")
Python

✅ 実行結果例

✅ email OK → user@example.com
❌ email NG → bad@@mail
✅ phone OK → 090-1234-5678
❌ phone NG → 12345
✅ date OK → 2025-11-02
❌ date NG → 2025-13-40
✅ url OK → https://www.example.com/path
❌ url NG → htp://bad_url
✅ postal OK → 100-0001
❌ postal NG → 12-345

応用例:フォーム検証風

inputs = {
    "email": "info@sample.co.jp",
    "phone": "03-1111-2222",
    "date": "2025-11-02",
    "url": "https://python.org",
    "postal": "100-0001"
}

all_valid = all(validate(v, k, verbose=False) for k, v in inputs.items())
print("🎉 全てOK!" if all_valid else "⚠ 一部にエラーがあります")
Python

ポイント解説

機能内容
re.VERBOSE正規表現を読みやすく、コメント付きで書ける
patterns dict各タイプのパターンを一元管理
validate()type で自動選択し、結果を返す汎用関数
verbose 引数メッセージ出力の ON/OFF 切り替え
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました