Python | re.VERBOSE を使った正規表現の書き方練習問題

Python
スポンサーリンク

応用練習問題(URL・郵便番号・電話番号)

では URL・郵便番号・電話番号の re.VERBOSE 練習問題 を作り、空欄補充+自動採点用コード 付きでまとめます。


問題 1:URL

空欄を埋めて、re.VERBOSE 形式で URL 正規表現を完成させましょう。

import re

pattern_url = re.compile(r"""
    ^                       # 文字列の先頭
    (https?|ftp)            # _________ ← 空欄1(プロトコル)
    ://                     # _________ ← 空欄2(スキーム区切り)
    [A-Za-z0-9.-]+          # ドメイン名
    (\.[A-Za-z]{2,})+       # _________ ← 空欄3(トップレベルドメイン)
    (/[A-Za-z0-9._~:/?#@!$&'()*+,;=%-]*)?  # パス(任意)
    $                       # 文字列の終わり
""", re.VERBOSE)
Python

問題 2:郵便番号

空欄を埋めて、re.VERBOSE 形式で日本の郵便番号正規表現を完成させましょう。

pattern_postal = re.compile(r"""
    ^               # 文字列の先頭
    \d{3}           # _________ ← 空欄1(上3桁)
    -?              # _________ ← 空欄2(ハイフン任意)
    \d{4}           # 下4桁
    $               # 文字列の終わり
""", re.VERBOSE)
Python

問題 3:電話番号(ハイフン任意)

空欄を埋めて、re.VERBOSE 形式で電話番号正規表現を完成させましょう。

pattern_phone = re.compile(r"""
    ^               # 文字列の先頭
    0\d{1,4}        # _________ ← 空欄1(市外局番)
    -?              # _________ ← 空欄2(ハイフン任意)
    \d{1,4}         # 市内局番
    -?              # _________ ← 空欄3(ハイフン任意)
    \d{3,4}         # 加入者番号
    $               # 文字列の終わり
""", re.VERBOSE)
Python

模範解答 + 解説

解答 1:URL

# 空欄1: https?|ftp      ← http, https, ftp のどれか
# 空欄2: ://            ← スキームとドメインの区切り
# 空欄3: \.[A-Za-z]{2,} ← トップレベルドメイン

💡解説:

  • (https?|ftp) は「http or https or ftp」
  • :// はプロトコルとドメインの区切り
  • \.[A-Za-z]{2,}.com.jp などを表す

解答 2:郵便番号

# 空欄1: \d{3}  ← 上3桁
# 空欄2: -?     ← ハイフンがあってもなくてもOK

💡解説:

  • \d{3}\d{4} で数字の桁数を指定
  • -? はハイフンを任意にする

解答 3:電話番号

# 空欄1: 0\d{1,4} ← 市外局番
# 空欄2: -?       ← ハイフン任意
# 空欄3: -?       ← ハイフン任意

💡解説:

  • 市外局番は 0 で始まる数字1〜4桁
  • ハイフンはあってもなくてもマッチさせる
  • 市内局番と加入者番号も同様に数字の範囲を指定

自動採点用コード

# 空欄補充回答(例)
answers = {
    "url": [ "https?|ftp", "://", r"\.[A-Za-z]{2,}" ],
    "postal": [ r"\d{3}", "-?" ],
    "phone": [ r"0\d{1,4}", "-?", "-?" ]
}

# 自動採点関数
def check_answer(type_, user_answers):
    correct = answers[type_]
    score = 0
    for i, ans in enumerate(correct):
        if user_answers[i].strip() == ans:
            score += 1
    print(f"{type_} : {score}/{len(correct)} 正解")
    if score != len(correct):
        print("正解:", correct)
        print("あなたの回答:", user_answers)
Python

💡 使い方:

check_answer("url", ["https?|ftp", "://", r"\.[A-Za-z]{2,}"])
check_answer("postal", [r"\d{3}", "-?"])
check_answer("phone", [r"0\d{1,4}", "-?", "-?"])
タイトルとURLをコピーしました