在 Python 字符串字面量前加 r 或 R 前綴,創建「原始字符串」。它的核心語義:反斜杠 \ 不再作為轉義字符,而是字面量本身。本文詳細說明其行為邊界、常見應用場景及注意事項。
>> print("asdfas\n") # 普通字符串:\n 被解析為換行
asdfas
>>> print(r"asdfas\n") # 原始字符串:\n 保持原樣
asdfas\n
\n、\t、\\、\xhh、\uhhhh 等均不轉義。>> r'it\'s ok' # 正確
"it's ok"
>>> r"say \"hi\"" # 正確
'say "hi"'
r"abc\" 語法錯誤,因為結尾引號被反斜杠「轉義」了。需寫 r"abc\\" 或 "abc\\"。r""、R"" 效果相同。rf""(Python 3.6+ f-string)、rb""(bytes)、ru""(Python 2 兼容)。正則本身大量使用 \(如 \d、\w、\b、\\),普通字符串需雙重轉義 \\d,極易出錯。
Windows 路徑使用反斜杠分隔,普通字符串需寫 "C:\\Users\\Name\\Docs"。
原始字符串僅影響源碼編譯階段的轉義處理,不影響運行時編碼。運行時它們仍是普通 str 對象,編碼為 UTF-8(Python 3 默認)。
>> s = r'\u4e2d'
>>> s
'\\u4e2d' # 長度 6,字面反斜杠+u4e2d
>>> len(s)
6
>>> s.encode('utf-8')
b'\\\\u4e2d'
若需 Unicode 轉義生效,請勿用 r 前綴,或使用 bytes.decode('unicode_escape')。
| 誤區 | 正確認知 |
|---|---|
r 字符串不能包含反斜杠 | 恰恰相反,專為保留反斜杠設計 |
r"\n" 會換行 | 不會,輸出字面 \n |
可用 r"..." 表示以反斜杠結尾的路徑 | 不可,結尾反斜杠會轉義引號,導致語法錯誤 |
r 前綴改變運行時行為 | 僅影響編譯期詞法分析,運行時無差別 |
r"" 定義模式。pathlib.Path(跨平台、語義化),次選 r""。r"""..."""。r,減少認知負荷。原始字符串是 Python 為處理「反斜杠密集」場景提供的語法糖,正確使用能消除大量雙重轉義帶來的 Bug,提升代碼可讀性與維護性。