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

Python
スポンサーリンク

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)入力種別に応じて自動判定する仕組み
Python
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました