Pythonで文字列を扱う際、バックスラッシュ(\、Windows環境では ¥ と表示されることもあります)は、「エスケープシーケンス」という特殊な意味を持ちます。\n は改行、\t はタブとして解釈されます。
この機能は便利ですが、Windowsのファイルパス(C:\Users\Name)や正規表現のパターン(\d+)のように、バックスラッシュそのものを文字として扱いたい場合には不便です。
通常の文字列では、バックスラッシュ自体を \\ と2重に書く必要があります。
# 通常の文字列: \\ と2重に書く必要がある
win_path = "C:\\Users\\Profile\\Documents"
print(win_path)
実行結果:
C:\Users\Profile\Documents
これでは読みにくく、間違いも起こりやすくなります。この問題を解決するのが Raw文字列(生文字列) です。
Raw文字列 (r”…”) とは
Raw文字列は、文字列リテラルの開始クォート(" や ')の直前に r または R を付けることで作成します。
Raw文字列の中では、バックスラッシュ(\)はエスケープ文字としての特殊な意味を失い、単なる文字(リテラルなバックスラッシュ)として扱われます。
Raw文字列の使用例
1. Windowsのファイルパス
Raw文字列の最も一般的な使い道は、Windowsのファイルパスの記述です。\\ と書く必要がなくなり、見たままのパスを記述できます。
# Raw文字列 (r"...") を使用
# バックスラッシュがそのまま文字として扱われる
win_path_raw = r"C:\Users\Profile\Documents\note.txt"
print(win_path_raw)
# \n や \t も特殊文字として解釈されない
test_string = r"Line 1\nLine 2\tTabbed"
print(test_string)
実行結果:
C:\Users\Profile\Documents\note.txt
Line 1\nLine 2\tTabbed
\n が改行されず、そのまま \n という2文字として出力されていることがわかります。
2. 正規表現のパターン
Raw文字列が非常に役立つもう一つの場面が、正規表現です。正規表現では、\d(数字)や \w(単語文字)のように、バックスラッシュを含む特殊なシーケンスが多用されます。
Raw文字列を使わない場合、Pythonの文字列エスケープ(\\d)と正規表現エンジンのエスケープが二重に必要になり、非常に複雑になります。
import re
# 正規表現のパターン文字列
# 郵便番号(例: 123-4567)にマッチさせたい
zip_code = "My zip is 330-0061."
# 1. 通常の文字列(非推奨): '\\d' と書く必要がある
pattern_normal = "\\d{3}-\\d{4}"
# 2. Raw文字列(推奨): r'...' を使うと見たまま書ける
pattern_raw = r"\d{3}-\d{4}"
match1 = re.search(pattern_normal, zip_code)
match2 = re.search(pattern_raw, zip_code)
print(f"通常文字列でのマッチ: {match1.group(0)}")
print(f"Raw文字列でのマッチ: {match2.group(0)}")
実行結果:
通常文字列でのマッチ: 330-0061
Raw文字列でのマッチ: 330-0061
pattern_raw の方が、正規表現のパターンとして直感的で読みやすいことがわかります。
Raw文字列の制限(注意点)
Raw文字列には一つだけ構文上の制限があります。それは、「文字列の末尾を奇数個のバックスラッシュで終えることができない」という点です。
# これはOK(末尾が偶数個の \)
# ok_path = r"C:\Temp\\"
# これは SyntaxError になる
# error_path = r"C:\Temp\"
これは、Pythonインタプリタが末尾の \ によって、その直後にあるクォート(")をエスケープしようと試みてしまい、文字列が閉じていないと判断するためです。
もしパスの末尾に \ が必要な場合(ディレクトリを示す場合など)は、Raw文字列を使わずに \\ と書くか、以下のようにRaw文字列と通常の文字列を連結します。
# ディレクトリのパス(末尾に \ が必要)
dir_path = r"C:\Temp" + "\\"
print(dir_path)
実行結果:
C:\Temp\
まとめ
- Raw文字列は、
r"..."またはr'...'のようにrプレフィックスを付けて作成します。 - Raw文字列内では、バックスラッシュ(
\)はエスケープ文字としての機能を失い、通常の文字として扱われます。 - Windowsのファイルパスや、正規表現のパターンを記述する際に非常に便利で、可読性が向上します。
- 文字列の末尾を
\で終わらせることはできない点にのみ注意が必要です。
