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

Python
スポンサーリンク

ここでは、「メール」「電話番号」「日付」「URL」「郵便番号」などの 代表的な正規表現テンプレート を、
re.VERBOSE(コメント付きモード) で「読みやすく整形」した実用コードに書き直します。


re.VERBOSE とは?

通常、正規表現は「1行でギチギチ」になって読みにくいですが、
re.VERBOSE フラグを使うと…

  • 改行やスペースを自由に入れられる
  • # でコメントを付けられる

つまり、正規表現を「見やすいコード」として整理できます!


各テンプレート(re.VERBOSE + コメント付き)

メールアドレス

import re

email_pattern = re.compile(r"""
    ^                       # 文字列の先頭
    [A-Za-z0-9._%+-]+       # ユーザー名部分(英数字と ._%+-)
    @                       # @記号
    [A-Za-z0-9.-]+          # ドメイン名部分
    \.                      # ドット
    [A-Za-z]{2,}            # トップレベルドメイン(2文字以上)
    $                       # 文字列の終わり
""", re.VERBOSE)

# ✅ テスト
print(bool(email_pattern.match("example.user+test@gmail.com")))  # True
print(bool(email_pattern.match("bad@address")))                   # False
Python

電話番号(日本形式)

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

print(bool(phone_pattern.match("03-1234-5678")))   # True
print(bool(phone_pattern.match("09012345678")))    # True
print(bool(phone_pattern.match("123456")))         # False
Python

日付(YYYY-MM-DD)

date_pattern = 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)

print(bool(date_pattern.match("2025-11-02")))  # True
print(bool(date_pattern.match("1999-13-01")))  # False
Python

URL

url_pattern = 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)

print(bool(url_pattern.match("https://www.example.com")))            # True
print(bool(url_pattern.match("ftp://server.local:8080/path/test")))  # True
print(bool(url_pattern.match("htp://bad.com")))                      # False
Python

郵便番号(日本)

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

print(bool(postal_pattern.match("100-0001")))  # True
print(bool(postal_pattern.match("1000001")))   # True
print(bool(postal_pattern.match("123-45")))    # False
Python

補足:複数パターンをまとめた入力バリデーション関数

def validate_input(value, pattern, name):
    if pattern.match(value):
        print(f"{name}: OK ✅ → {value}")
    else:
        print(f"{name}: NG ❌ → {value}")

# テスト実行
validate_input("user@example.com", email_pattern, "メール")
validate_input("03-1234-5678", phone_pattern, "電話番号")
validate_input("2025-11-02", date_pattern, "日付")
validate_input("https://python.org", url_pattern, "URL")
validate_input("100-0001", postal_pattern, "郵便番号")
Python

まとめ

種類主な用途特徴
📧 メールアドレス形式のチェック英数字 + @ + ドメイン構造
☎ 電話固定・携帯対応ハイフンあり/なし両対応
📅 日付入力フォームYYYY-MM-DD 形式に限定
🌐 URLWebアドレス検証プロトコル+ドメイン+パス対応
🏣 郵便番号住所フォーム3桁-4桁 または 7桁

どちらを作りましょうか?

Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました