10. 模範解答と解説
問題①
re.findall(r"\d{3}", "abc123xyz4567")
Python✅ 模範解答:
import re
result = re.findall(r"\d{3}", "abc123xyz4567")
print(result) # ['123', '456']
Python💡 解説:
\dは「数字(0〜9)」を意味します。{3}は「3文字連続」という指定です。- つまり
\d{3}は「3桁の数字」を探す正規表現です。 - 文字列
"abc123xyz4567"の中では、123(3桁)456(3桁)
がマッチします。
- 最後の
7は1桁だけなので無視されます。
👉 ポイント:
普通の文字列だと "\\d{3}" と書かないといけません。
raw 文字列(r"...")を使うことで、"\d{3}" と書いても\ をそのまま「バックスラッシュ」として扱ってくれます。
見やすくてミスが減ります!
問題②
ログに記録された
C:\tmp\log.txtを正規表現で検出したい。re.search()に渡すパターンをr"..."を使って書いてください。
✅ 模範解答:
import re
text = "Error at C:\\tmp\\log.txt line 12"
pattern = r"C:\\tmp\\log\.txt"
match = re.search(pattern, text)
if match:
print("見つかりました!:", match.group())
Python💡 解説:
- Windows のパスにはバックスラッシュ(
\)が含まれます。
正規表現の中では\自体が特別な意味を持つので、
そのまま書くと混乱します。 - 例えば普通の文字列
"C:\\tmp\\log\\.txt"は
バックスラッシュが二重になって見づらいです。 - そこで 生文字列
r"..."を使うと:
r"C:\\tmp\\log\.txt"
Pythonのように簡潔に書けます。
\\→ 実際の「\」を表す\.→ 「ドットそのもの」を表す(.は通常は「任意の1文字」を意味するため)
👉 ポイント:
Windows パスや正規表現のように \ を多用する場面では
raw 文字列を使うのが鉄則です。
問題③
re.VERBOSEを使って、YYYY-MM-DDの形式を読みやすく書き、"2025-11-02"でマッチするか確認してください。
✅ 模範解答:
import re
pattern = re.compile(r"""
^ # 文字列の先頭
(\d{4}) # 年(4桁の数字)
- # ハイフン
(0[1-9]|1[0-2])# 月(01〜12)
- # ハイフン
(0[1-9]|[12]\d|3[01]) # 日(01〜31)
$ # 文字列の末尾
""", re.VERBOSE)
text = "2025-11-02"
match = pattern.match(text)
if match:
print("日付として正しい形式です!:", match.group())
else:
print("マッチしません。")
Python💡 解説:
re.VERBOSEオプションを使うと、
正規表現の中に「改行」や「コメント(#)」を入れてもOKになります。- 長い正規表現を見やすく整形できるのが最大の利点。
- ここでは:
^と$… 文字列の先頭と末尾を指定(全体一致)\d{4}… 年(4桁)0[1-9]|1[0-2]… 月(01〜12)0[1-9]|[12]\d|3[01]… 日(01〜31)
r"""..."""と三重引用+raw 文字列を使うことで
バックスラッシュを維持しつつ、複数行で読みやすく記述できます。
👉 ポイント:
正規表現が長くなると「何をしているかわからなくなる」ので、r"""...""" + re.VERBOSE の組み合わせが非常に便利です!
まとめ
| 用途 | raw 文字列を使うメリット |
|---|---|
パス文字列 (C:\folder) | バックスラッシュが簡潔に書ける |
| 正規表現パターン | \d, \b, \s などが見やすい |
| 長いパターン(re.VERBOSE) | 三重引用符と組み合わせて読みやすく書ける |
| バグ防止 | 「\n」や「\t」などが誤って特殊文字にならない |
