では 正規表現(Regex)での raw文字列利用 を初心者向けにやさしく解説し、例題も交えて詳しく説明します。
正規表現とは?
正規表現(Regex)は、「文字列のパターンを指定して検索・抽出・置換する方法」です。
例:
import re
text = "電話番号は090-1234-5678です"
pattern = r"\d{3}-\d{4}-\d{4}"
result = re.findall(pattern, text)
print(result)
Python出力:
['090-1234-5678']
\d→ 数字を意味します(0~9){3}→ 直前の文字が3回連続-→ ハイフン- raw文字列
r"..."を使うことで、\dがそのまま「数字の意味」として解釈されます。
raw文字列が必要な理由
正規表現には \ がたくさん出てきます:
\d→ 数字\w→ 英数字またはアンダースコア\s→ 空白文字\b→ 単語の境界
もし raw文字列を使わないと…
pattern = "\\d{3}-\\d{4}-\\d{4}"
Python\dを出すために\\dと二重に書かなければなりません。- 見にくく、間違いやすいです。
raw文字列を使うと、シンプルに書けます:
pattern = r"\d{3}-\d{4}-\d{4}"
Python\をそのまま書ける- 読みやすく、ミスも減ります
例題1:数字だけ抽出
import re
text = "私の電話は080-1234-5678で、友達の電話は070-9876-5432です"
pattern = r"\d{3}-\d{4}-\d{4}"
numbers = re.findall(pattern, text)
print(numbers)
Python出力:
['080-1234-5678', '070-9876-5432']
解説:
\d{3}→ 3桁の数字\d{4}→ 4桁の数字- ハイフンはそのまま
- raw文字列なので
\dを二重に書く必要なし
例題2:単語を抽出(空白で区切る)
text = "Pythonは楽しい 言語です"
pattern = r"\b\w+\b"
words = re.findall(pattern, text)
print(words)
Python出力:
['Python', 'は', '楽しい', '言語', 'です']
\b→ 単語の境界\w+→ 1文字以上の英数字や日本語など(PythonではUnicode対応)- raw文字列を使うことで、
\bや\wを正しく解釈させています
ポイントまとめ
- 正規表現には
\が多く出てくる - 通常文字列で書くと
\\dのように二重になりややこしい - raw文字列
r"..."を使うと、\をそのまま書けてスッキリ - ファイルパスや正規表現では raw文字列が特に便利
練習問題
- 文章からメールアドレスを抽出する正規表現を書こう
- 文章から数字だけを抽出し、リストにする
- 文の先頭の単語だけを抽出する
すべて raw文字列を使って書くと、\ の扱いが簡単になります。
解答・解説
問題1:文章からメールアドレスを抽出
次の文章から、メールアドレスをすべて抽出してください。
import re
text = "連絡は info@example.com または support@python.org までお願いします。"
# ここに正規表現パターンを書いて、re.findall() を使う
pattern = r"..." # ここを完成させる
emails = re.findall(pattern, text)
print(emails)
Python解答例
pattern = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"
emails = re.findall(pattern, text)
print(emails)
Python出力:
['info@example.com', 'support@python.org']
解説
[a-zA-Z0-9_.+-]+→ メールのユーザー名部分(英数字・記号1文字以上)@→ 「@」そのもの[a-zA-Z0-9-]+→ ドメイン名\.→ ドット(raw文字列なので\.でOK)[a-zA-Z0-9-.]+→ ドメインの最後の部分- raw文字列を使うことで、
\.のようなバックスラッシュを二重に書く必要がなく、見やすい
問題2:文章から数字だけを抽出
import re
text = "私は今年30歳で、弟は12歳です。"
# 数字だけを抽出する正規表現を書こう
pattern = r"..." # ここを完成させる
numbers = re.findall(pattern, text)
print(numbers)
Python解答例
pattern = r"\d+"
numbers = re.findall(pattern, text)
print(numbers)
Python出力:
['30', '12']
解説
\d→ 数字1文字+→ 1文字以上- raw文字列
r"\d+"にすることで、\dをそのまま使える
問題3:文の先頭の単語だけを抽出
import re
text = "Pythonは楽しい言語です。"
# 文の先頭の単語だけを抽出
pattern = r"..." # ここを完成させる
first_word = re.findall(pattern, text)
print(first_word)
Python解答例
pattern = r"^\w+"
first_word = re.findall(pattern, text)
print(first_word)
Python出力:
['Python']
解説
^→ 文字列の先頭\w+→ 1文字以上の英数字または日本語文字- raw文字列
r"^\w+"で書くことで、\wがそのまま「単語文字」として扱える - 文頭の単語だけ抽出できる
ポイントまとめ
- 正規表現では
\が多く出てくる - raw文字列
r"..."を使うと、\をそのまま書ける - 見やすく、間違いも少なくなる
- 数字抽出やメールアドレス抽出など、文字列処理でよく使う
