応用練習問題(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}", "-?", "-?"])
