ここでは、先ほどの メール/電話/日付/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 切り替え |
