Python 正規表現による入力バリデーション関数集
ここでは、先ほどの「正規表現テンプレート集」をベースにした
入力バリデーション関数集 を作ります。
それぞれの関数は「正しい形式かどうか」を True / False で返すので、
Webフォーム・CLI入力チェックなどにそのまま使えます ✅
1️⃣ メールアドレス判定
import re
def is_valid_email(address: str) -> bool:
pattern = re.compile(r"^[\w\.-]+@[\w\.-]+\.\w+$")
return bool(pattern.match(address))
# 動作確認
print(is_valid_email("info@mail.co.jp")) # True
print(is_valid_email("user@")) # False
print(is_valid_email("test@@example.com"))# False
Python💡ポイント
- シンプルで実用的なパターン。
bool()でTrue/Falseに変換して返す。- RFC準拠ではないが、一般的なメール入力チェックに十分。
2️⃣ 電話番号(日本形式)
def is_valid_phone(number: str) -> bool:
pattern = re.compile(r"^0\d{1,4}-\d{1,4}-\d{4}$")
return bool(pattern.match(number))
# 動作確認
print(is_valid_phone("090-1234-5678")) # True
print(is_valid_phone("03-123-4567")) # True
print(is_valid_phone("123456789")) # False
Python💡ポイント
- ハイフンが必須(
-なしは無効)。 - 携帯 (
090-系)・固定 (03-系) どちらも通る。 - 実務では入力時の「数字のみ」対応バージョンも用意しておくと便利。
3️⃣ 日付(YYYY-MM-DD)
def is_valid_date(date_str: str) -> bool:
pattern = re.compile(r"^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$")
return bool(pattern.match(date_str))
# 動作確認
print(is_valid_date("2025-11-02")) # True
print(is_valid_date("2025-13-01")) # False
print(is_valid_date("25-11-02")) # False
Python💡ポイント
- 年・月・日すべてゼロ埋め必須。
- 書式チェックのみ(存在しない日付「2025-02-30」も通る)。
→ 本当に存在する日付か確認したいときはdatetimeモジュールと併用。
4️⃣ URL(http / https)
def is_valid_url(url: str) -> bool:
pattern = re.compile(r"^https?://[\w.-]+(?:\.[\w.-]+)+[/\w\-.?=&%]*$")
return bool(pattern.match(url))
# 動作確認
print(is_valid_url("https://example.com")) # True
print(is_valid_url("http://test-site.jp/path")) # True
print(is_valid_url("ftp://invalid.com")) # False
Python💡ポイント
https?://で http と https の両方に対応。ftp://やfile://などは除外されます。- パスやクエリも最低限サポート。
5️⃣ 郵便番号(日本形式)
def is_valid_zip(zip_code: str) -> bool:
pattern = re.compile(r"^\d{3}-\d{4}$")
return bool(pattern.match(zip_code))
# 動作確認
print(is_valid_zip("123-4567")) # True
print(is_valid_zip("1234567")) # False
Python💡ポイント
- 「123-4567」形式専用。
- ハイフン必須。
- 郵便番号の存在確認は別データベースで可能。
6️⃣ IPv4 アドレス
def is_valid_ipv4(ip: str) -> bool:
pattern = re.compile(r"^(?:\d{1,3}\.){3}\d{1,3}$")
if not pattern.match(ip):
return False
# 各セグメントが 0〜255 の範囲か確認
return all(0 <= int(part) <= 255 for part in ip.split("."))
# 動作確認
print(is_valid_ipv4("192.168.0.1")) # True
print(is_valid_ipv4("256.10.10.1")) # False
Python💡ポイント
- 形式+範囲チェックの両方を実装。
- サーバーやネットワーク設定の入力バリデーションに便利。
7️⃣ 半角英数字のみ
def is_alphanumeric(text: str) -> bool:
pattern = re.compile(r"^[A-Za-z0-9]+$")
return bool(pattern.match(text))
# 動作確認
print(is_alphanumeric("Hello123")) # True
print(is_alphanumeric("Hello_123")) # False
Python💡ポイント
- 英文字と数字以外(記号・日本語など)が入っていたら
False。 - パスワードやユーザーIDの基本チェックに使える。
8️⃣ 前後の空白削除(トリム)
def trim_spaces(text: str) -> str:
return re.sub(r"^\s+|\s+$", "", text)
# 動作確認
print(trim_spaces(" Hello world! \n")) # 'Hello world!'
Python💡ポイント
- 正規表現で両端の空白(全角スペース含む)をまとめて除去。
.strip()と似ているが、reなら細かい指定も可能。
まとめ:すべての関数を一括で使う
# まとめテスト
inputs = {
"email": "info@example.com",
"phone": "03-1234-5678",
"date": "2025-11-02",
"url": "https://example.com",
"zip": "123-4567",
"ipv4": "192.168.1.1",
"user": "Alice123",
}
print(is_valid_email(inputs["email"]))
print(is_valid_phone(inputs["phone"]))
print(is_valid_date(inputs["date"]))
print(is_valid_url(inputs["url"]))
print(is_valid_zip(inputs["zip"]))
print(is_valid_ipv4(inputs["ipv4"]))
print(is_alphanumeric(inputs["user"]))
Python出力:
True
True
True
True
True
True
True
応用編(次にできること)
| テーマ | 説明 |
|---|---|
| 🔹 re.VERBOSE 対応 | 正規表現を読みやすくコメント付きで書き直す |
| 🔹 dataclass 化 | ValidationResult などの構造体で詳細情報を返す |
| 🔹 Webフォーム連携 | Flask/DjangoなどでPOST値の入力検証に使う |
🔹 汎用関数 validate(value, type) | 入力種別に応じて自動判定する仕組み |
