Pythonで文字列を検索したり、一部を取り出したりしたいときに便利なのが正規表現です。
ただ、正規表現にはバックスラッシュ(\
)を使った特殊な記号が多く、
Pythonの文字列のルールと混ざって混乱することもあります。
この記事では、Pythonにおける正規表現の基本と、raw文字列リテラルの必要性についてわかりやすくまとめます。
正規表現とは?
正規表現(Regular Expression)とは、文字列のパターンを表現する方法です。
特定の形式にマッチする文字列を探したり、置き換えたりするのに使います。
よく使われる正規表現パターンを紹介します。
パターン | 意味 | 例 |
---|---|---|
\d |
数字1文字 |
0 ~9
|
\w |
英数字またはアンダースコア |
a , Z , 0 , _
|
\s |
空白文字(スペース・タブ・改行) | 空白 |
. |
任意の1文字 | 何でも1文字 |
* |
直前のパターンが0回以上繰り返される |
"a*" は"" 、"a" , "aa" などにマッチ |
+ |
直前のパターンが1回以上繰り返される |
"a+" は"a" , "aa" などにマッチ |
[] |
文字クラス(いずれか1文字) |
[abc] はa ,b ,c のどれかにマッチ |
() |
グループ化 |
(abc) で1つの単位として扱う |
これらを組み合わせることで、複雑な文字列パターンを簡単に扱えるようになります。
Pythonで正規表現を使うには?
Pythonでは標準ライブラリre
モジュールを使って正規表現を扱います。
簡単な例を見てみましょう。
import re
pattern = r"\d{3}-\d{4}"
text = "郵便番号は123-4567です。"
result = re.search(pattern, text)
if result:
print(result.group())
出力:
123-4567
このコードは「3桁の数字-4桁の数字」(例:123-4567)というパターンを探して、最初に見つかったものを出力しています。
ポイントは、pattern
を定義するときに**r"..."
(raw文字列リテラル)を使っている**ことです。
なぜraw文字列リテラルが必要なのか?
正規表現では、\d
や \s
など、バックスラッシュを使った記号がたくさん登場します。
もし普通の文字列("..."
)で書いてしまうと、Pythonのエスケープシーケンス処理が先に働いてしまい、意図した正規表現として使えないことがあります。
例:普通の文字列で書いた場合
import re
pattern = "\d{3}-\d{4}" # ❌ 普通の文字列
text = "郵便番号は123-4567です。"
result = re.search(pattern, text)
print(result)
出力:
None
\d
の部分が正しく認識されず、パターンマッチングに失敗してしまっています。
これを防ぐために、raw文字列リテラル(r"..."
)を使うのが基本です。
import re
pattern = r"\d{3}-\d{4}" # ✅ raw文字列
text = "郵便番号は123-4567です。"
result = re.search(pattern, text)
print(result.group())
出力:
123-4567
raw文字列リテラルを使うことで、バックスラッシュがそのまま渡され、正規表現エンジンが正しく解釈できるようになります。
正規表現では常にraw文字列を使うべき?
Pythonの公式ドキュメントでも推奨されているように、Pythonで正規表現を書くときは基本的にraw文字列リテラルを使うべきです。
たとえ今すぐに問題が起きなくても、将来パターンを複雑にしたときにバグを防ぐためにも、習慣化しておくことが大切です。
# 正規表現は必ず raw で書く習慣を!
pattern = r"\w+@\w+\.\w+"
このように書くと、メールアドレスなどのパターンも安全に扱うことができます。
raw文字列リテラルの注意点(正規表現版)
- raw文字列リテラルでもクォート(
"
や'
)は通常通り扱う必要がある - 最後にバックスラッシュだけ置くとエラーになる(これは正規表現に限らず)
-
r"..."r"..."
のようにr
を2回連続して書くことはできない - 複雑なパターンでも、rを付けるだけでエスケープミスが防げる
まとめ
- 正規表現は文字列のパターンを表現するための強力な仕組み
- Pythonで正規表現を書くときは、バックスラッシュを多用するためraw文字列リテラル(
r"..."
)を使うのが基本 - 普通の文字列で書くとPython側のエスケープ処理が邪魔をしてうまくいかないことがある
- バグを防ぐためにも、正規表現を書くときは常に
r"..."
を付ける習慣をつける