ここでは、「メール」「電話番号」「日付」「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
PythonURL
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 形式に限定 |
| 🌐 URL | Webアドレス検証 | プロトコル+ドメイン+パス対応 |
| 🏣 郵便番号 | 住所フォーム | 3桁-4桁 または 7桁 |
どちらを作りましょうか?
