Pythonを学んでいると、エスケープシーケンスや正規表現、raw文字列リテラルという用語が出てきます。
これらはそれぞれ役割が違いますが、どれもバックスラッシュ(\
)を使うため、混乱しやすいポイントです。
この記事では、エスケープシーケンスと正規表現の違い、そしてそれらを扱う際に重要なraw文字列リテラルの使い方について整理します。
エスケープシーケンスとは?
エスケープシーケンスは、Pythonの文字列リテラル内でバックスラッシュ\
を使い、特殊な意味を持たせるものです。
「エスケープ」という言葉には、「通常の文字の意味を抜け出す」という意味があります。
代表例:
シーケンス | 意味 |
---|---|
\n |
改行 |
\t |
タブ(空白) |
\\ |
バックスラッシュ自身 |
\' |
シングルクォート |
\" |
ダブルクォート |
例:
print("Hello\nWorld")
出力:
Hello
World
ここで\n
は、普通のn
ではなく「改行をする」というPython自身の文字列ルールに従っています。
正規表現とは?
正規表現は、文字列のパターンマッチングを行うための表現方法です。
こちらでも\d
や\w
のようにバックスラッシュを使った表記が多く出てきます。
代表例:
パターン | 意味 |
---|---|
\d |
数字1文字(0〜9) |
\w |
英数字またはアンダースコア |
\s |
空白文字 |
例:
import re
pattern = r"\d{3}-\d{4}"
text = "郵便番号は123-4567です。"
result = re.search(pattern, text)
if result:
print(result.group())
出力:
123-4567
ここでは\d
が「数字1文字」を表す正規表現のルールに従っています。
エスケープシーケンスと正規表現の違いまとめ
項目 | エスケープシーケンス | 正規表現 |
---|---|---|
属する世界 | Pythonの文字列処理 | 正規表現エンジンのパターン処理 |
目的 | 特別な文字(改行・タブなど)を扱う | 文字列パターンを指定する |
例 |
\n , \t , \\
|
\d , \w , \s
|
注意点 | バックスラッシュがPython側で解釈される | バックスラッシュを正規表現に伝える必要あり |
Pythonの文字列と正規表現では、どちらも\
を使うが意味が違うため、ここが混乱の元になります。
なぜraw文字列リテラルが必要なのか?
問題は、Pythonの通常の文字列リテラル内ではバックスラッシュがPython自身のエスケープシーケンスとして処理されることです。
つまり、"\d"
と書くと、
- Python:「\d?そんなエスケープシーケンスは知らないな」
- → 意図しない動作 or エラーになる
これを防ぐために、raw文字列リテラル(r"..."
)を使います。
raw文字列リテラルを使うと、Pythonはバックスラッシュを特別扱いせず、見たまま正規表現エンジンに渡します。
例:
import re
# 通常の文字列(失敗する例)
pattern = "\d{3}-\d{4}" # ❌
# raw文字列(正しい例)
pattern = r"\d{3}-\d{4}" # ✅
raw文字列を使うことで、Pythonのエスケープ問題を回避し、正規表現を正しく扱えるようになります。
raw文字列リテラルの使い方まとめ
・バックスラッシュをエスケープせず「そのままの文字」として扱いたいときは、raw文字列リテラルを使う。
(例:Windowsのパスや\n
を文字として表示したいとき)
print(r"C:\Users\Name\Desktop")
# 出力: C:\Users\Name\Desktop
・正規表現のパターンを書くときは、必ず raw文字列リテラルを使う。
(バックスラッシュが多用されるため、Pythonの文字列処理で壊れてしまうのを防ぐ)
import re
pattern = r"\d{3}-\d{4}"
result = re.search(pattern, "郵便番号は123-4567です。")
print(result.group())
# 出力: 123-4567
まとめ
- エスケープシーケンスは、Pythonの文字列内でバックスラッシュを使い特殊な意味を持たせる仕組み
- 正規表現は、文字列パターンマッチングを行う方法で、こちらでもバックスラッシュを使う
- Pythonの文字列と正規表現ではバックスラッシュの扱いが違う
- その違いを埋めるために、raw文字列リテラル(
r"..."
)を使うことが必須
エスケープシーケンスと正規表現の違いを正しく理解し、適切にraw文字列リテラルを使いこなして、Pythonでの文字列操作を確実なものにします!