プログラミング

Pythonのr文字列とは?raw文字列の使い方を解説!(エスケープ無効:バックスラッシュ:正規表現:パス指定:raw stringなど)

当サイトでは記事内に広告を含みます

Pythonで文字列を書いていると、バックスラッシュの扱いに悩む場面が出てくることがあります。ファイルパスの指定や正規表現のパターン記述など、バックスラッシュを多用するケースでは通常の文字列だとコードが読みにくくなりがちです。そんなときに役立つのがr文字列(raw文字列・raw string)です。

r文字列は文字列の先頭に「r」または「R」をつけるだけで使えるシンプルな記法で、文字列内のバックスラッシュをエスケープシーケンスとして解釈しないようにする機能を持っています。Windowsのファイルパスや正規表現パターンを書く際にコードをすっきりさせる効果があります。

この記事では、Pythonのr文字列の基本的な仕組みから、正規表現・パス指定での活用法、注意点まで、サンプルコードとともにわかりやすく解説していきます。

Pythonのr文字列はバックスラッシュのエスケープを無効にするraw文字列

それではまず、r文字列の基本的な仕組みと、通常の文字列との違いについて解説していきます。

Pythonの通常の文字列では、バックスラッシュ「\」は特別な意味を持つエスケープシーケンスの開始文字として扱われます。\nは改行、\tはタブなど、特定の組み合わせで特殊な文字を表します。一方、r文字列ではバックスラッシュをただの文字として扱い、エスケープシーケンスを解釈しません。


# 通常の文字列とr文字列の違い
normal = "アボカド\nドラゴンフルーツ"   # \nは改行として解釈
raw = r"アボカド\nドラゴンフルーツ"     # \nをそのまま文字として扱う

print(normal)
print("---")
print(raw)

# 出力結果:アボカド
# 出力結果:ドラゴンフルーツ
# 出力結果:---
# 出力結果:アボカド\nドラゴンフルーツ

通常の文字列では\nが改行として処理されて2行に分かれて表示されますが、r文字列では\nがそのまま「\n」という2文字として表示されます。違いが一目瞭然でしょう。

r文字列の「r」は「raw(生の・未加工の)」の略です。バックスラッシュをエスケープ処理せず、書いた通りの「生の文字列」として扱うことが名前の由来になっています。

r文字列の基本的な書き方

r文字列は文字列の開始クォートの直前に「r」または「R」をつけるだけで使えます。


# r文字列の書き方バリエーション
r1 = r"シングルクォートでも使える"
r2 = r'ダブルクォートでも使える'
r3 = r"""トリプルクォートでも使える
複数行にも対応"""

# 大文字のRでも同じ動作
r4 = R"大文字Rも使える\n\t"

print(r1)
print(r4)

# 出力結果:シングルクォートでも使える
# 出力結果:大文字Rも使える\n\t

シングルクォート・ダブルクォート・トリプルクォートのいずれとも組み合わせられます。小文字の「r」が一般的ですが、大文字の「R」でも動作は同じです。

通常文字列とr文字列の比較

バックスラッシュを含む文字列を通常の書き方とr文字列で比べてみましょう。


# 通常文字列とr文字列の比較
# バックスラッシュ1文字を表現する場合
normal_bs = "\\"          # \\と書く必要がある
raw_bs = r"\"            # \1文字で書ける(ただし末尾はNG)

# 各種エスケープシーケンスの比較
normal = "タブ:\t改行:\n"
raw = r"タブ:\t改行:\n"

print(repr(normal))
print(repr(raw))

# 出力結果:'タブ:\t改行:\n'
# 出力結果:'タブ:\\t改行:\\n'

repr()で確認すると、r文字列ではバックスラッシュが「\\」として格納されていることがわかります。つまり内部的にはバックスラッシュが2文字分として扱われています。

r文字列で使えない書き方・注意点

r文字列には1つ重要な制約があります。末尾をバックスラッシュで終わらせることができません。


# r文字列の末尾にバックスラッシュは書けない
# path = r"C:\Users\gorilla\"  # SyntaxError になる

# 回避策1:末尾のバックスラッシュだけ通常文字列で追加
path = r"C:\Users\gorilla" + "\\"
print(path)

# 回避策2:文字列結合で対処
path2 = r"C:\Users\gorilla" + r"\documents"
print(path2)

# 出力結果:C:\Users\gorilla\
# 出力結果:C:\Users\gorilla\documents

末尾にバックスラッシュが必要な場合は、文字列の結合で対処するのが一般的です。

r文字列をWindowsのファイルパスに使う方法

続いては、r文字列の最も代表的な活用場面であるWindowsのファイルパス指定の方法を確認していきます。

Windowsのファイルパスはバックスラッシュで区切られるため、通常の文字列で書くと\nや\tなどのエスケープシーケンスと衝突することがあります。r文字列を使えばこの問題をスッキリ回避できます。

Windowsパスを通常文字列で書く問題点


# 通常文字列でWindowsパスを書く場合の問題
# \nが改行、\tがタブと解釈されてしまう
path_bad = "C:\new_folder\test.txt"
print(repr(path_bad))

# 通常文字列での正しい書き方(\\でエスケープ)
path_normal = "C:\\new_folder\\test.txt"
print(path_normal)

# r文字列での書き方(はるかにシンプル)
path_raw = r"C:\new_folder\test.txt"
print(path_raw)

# 出力結果:'C:\new_folder\test.txt'(\nや\tが特殊文字になっている)
# 出力結果:C:\new_folder\test.txt
# 出力結果:C:\new_folder\test.txt

通常文字列でWindowsパスを書くには\\と二重にする必要がありますが、r文字列なら\をそのまま書けます。パスが深い階層になるほど、r文字列の恩恵は大きくなるでしょう。

Pythonでのパス指定にpathlibと組み合わせる


from pathlib import Path

# r文字列とpathlibの組み合わせ
base = Path(r"C:\Users\gorilla\documents")
file_path = base / "report.txt"

print(file_path)
print(file_path.name)
print(file_path.parent)

# 出力結果:C:\Users\gorilla\documents\report.txt
# 出力結果:report.txt
# 出力結果:C:\Users\gorilla\documents

r文字列でベースパスを指定し、pathlibの「/」演算子でパスを結合する書き方はWindowsのファイル操作でよく使われるパターンです。

Linux・macOSのパスではr文字列は必須ではない


# Linux・macOSのパスはスラッシュ区切りなのでr文字列不要
path_linux = "/home/gorilla/documents/report.txt"
path_mac = "/Users/gorilla/documents/report.txt"

print(path_linux)
print(path_mac)

# ただしr文字列を使っても問題ない
path_raw = r"/home/gorilla/documents"
print(path_raw)

# 出力結果:/home/gorilla/documents/report.txt
# 出力結果:/Users/gorilla/documents/report.txt
# 出力結果:/home/gorilla/documents

Linux・macOSのパスはスラッシュ「/」で区切られるためエスケープの問題は起きませんが、r文字列を使っても動作に問題はありません。

r文字列を正規表現に使う方法

続いては、r文字列のもうひとつの重要な活用場面である正規表現パターンの記述方法を確認していきます。

正規表現では\d(数字)・\s(空白)・\w(単語文字)など、バックスラッシュを使った特殊記号を多用します。r文字列を使うことで、これらのパターンを直感的かつ読みやすく書けます。

通常文字列と比べた正規表現の書きやすさ


import re

text = "ネジ500個とボルト200本を注文しました。"

# 通常文字列で数字にマッチするパターン(\\dと書く必要がある)
pattern_normal = "\\d+"
matches_normal = re.findall(pattern_normal, text)

# r文字列で書く(\dとシンプルに書ける)
pattern_raw = r"\d+"
matches_raw = re.findall(pattern_raw, text)

print(matches_normal)
print(matches_raw)

# 出力結果:['500', '200']
# 出力結果:['500', '200']

どちらも同じ結果になりますが、r文字列の方がパターンの意図を読み取りやすくなっています。正規表現パターンにはr文字列を使うのがPythonのベストプラクティスとして広く認知されています。

複雑な正規表現パターンをr文字列で書く


import re

# メールアドレスのパターン
email_pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
text = "連絡先はgorilla@example.comかrobba@test.co.jpです。"
emails = re.findall(email_pattern, text)
print(emails)

# 電話番号のパターン
phone_pattern = r"\d{2,4}-\d{2,4}-\d{4}"
text2 = "電話番号は03-1234-5678または090-9876-5432です。"
phones = re.findall(phone_pattern, text2)
print(phones)

# 出力結果:['gorilla@example.com', 'robba@test.co.jp']
# 出力結果:['03-1234-5678', '090-9876-5432']

複雑な正規表現パターンでも、r文字列を使うことでバックスラッシュを二重にする必要がなくなり、パターンが格段に読みやすくなります。

re.compile()とr文字列の組み合わせ


import re

# re.compile()とr文字列でパターンを再利用
# 日本語文字にマッチするパターン
jp_pattern = re.compile(r"[ぁ-んァ-ン一-龥]+")

texts = ["Avocado500g", "ドラゴンフルーツ200g", "Salmon100g", "サーモン定食"]

for text in texts:
    match = jp_pattern.search(text)
    if match:
        print(f"日本語あり:{text} → {match.group()}")
    else:
        print(f"日本語なし:{text}")

# 出力結果:日本語なし:Avocado500g
# 出力結果:日本語あり:ドラゴンフルーツ200g → ドラゴンフルーツ
# 出力結果:日本語なし:Salmon100g
# 出力結果:日本語あり:サーモン定食 → サーモン定食

同じパターンを繰り返し使う場合はre.compile()でコンパイルしておくと効率的です。r文字列との組み合わせでパターンの可読性も保てます。

r文字列の応用と他の文字列プレフィックスとの組み合わせ

続いては、r文字列の応用的な使い方と、f文字列など他のプレフィックスとの組み合わせを確認していきます。

Pythonにはr以外にもf・b・uなどの文字列プレフィックスがあります。rfやrbのように組み合わせて使うことで、より柔軟な文字列表現が可能になります。

rf文字列(raw + f文字列)の使い方


# rf文字列:raw文字列 + f文字列の組み合わせ
import re

base_dir = r"C:\Users\gorilla"
filename = "report.txt"

# rfを使うとバックスラッシュを保ちながら変数埋め込みができる
full_path = rf"{base_dir}\{filename}"
print(full_path)

# 正規表現パターンに変数を埋め込む
word = "アボカド"
pattern = rf"{word}\d+"
text = "アボカド500gとドラゴンフルーツ200g"
matches = re.findall(pattern, text)
print(matches)

# 出力結果:C:\Users\gorilla\report.txt
# 出力結果:['アボカド500g']

rf(またはfr)と書くことで、バックスラッシュのエスケープ無効化と変数埋め込みを同時に利用できます。動的に生成する正規表現パターンやパス文字列に便利でしょう。

rb文字列(raw + bytes)の使い方


# rb文字列:raw文字列 + バイト文字列の組み合わせ
# バイナリプロトコルのパターンマッチングなどに使用
pattern = rb"\r\n"   # \r\nをバイト列として扱う

data = b"keyboard\r\nmouse\r\nmonitor"
lines = data.split(pattern)

for line in lines:
    print(line.decode("utf-8"))

# 出力結果:keyboard
# 出力結果:mouse
# 出力結果:monitor

rb文字列はバイナリデータの処理やネットワークプロトコルの実装などで使われます。バイト列に対してraw文字列の特性を持たせたい場合に活用できます。

r文字列を使うべき場面のまとめ

r文字列を使うべき場面と、通常文字列で十分な場面を整理しておきましょう。

場面 推奨 理由
Windowsファイルパス r文字列 バックスラッシュの衝突を回避
正規表現パターン r文字列 \dや\sがそのまま書ける
改行・タブを含む文字列 通常文字列 \nや\tをそのまま使いたい
Linux・macOSのパス どちらでも可 スラッシュ区切りで衝突なし
変数埋め込みが必要 rf文字列 rawとf文字列を組み合わせる

バックスラッシュを「文字として」多用する場面ではr文字列が有効です。逆に\nや\tなどエスケープシーケンスを意図的に使いたい場合は通常の文字列を使いましょう。

まとめ

この記事では、Pythonのr文字列(raw文字列)の仕組みと使い方について、基本からWindowsパス・正規表現での活用、rf文字列などの応用まで幅広く解説しました。

r文字列は文字列の先頭に「r」をつけるだけで、バックスラッシュをエスケープシーケンスとして解釈しない文字列になります。Windowsのファイルパスや正規表現パターンのように、バックスラッシュをそのままの文字として多用する場面で特に威力を発揮します。

末尾をバックスラッシュで終わらせられないという唯一の制約は、文字列の結合で対処できます。rf文字列を使えば変数埋め込みとの組み合わせも可能です。適切な場面でr文字列を活用して、読みやすいPythonコードを書いていきましょう。

正規表現パターンには常にr文字列を使う習慣をつけることで、バックスラッシュの二重記述が不要になりコードの可読性が上がります。Windowsのファイルパスも同様に、r文字列を使えばエスケープの混乱を防げます。