...'
,"..."
在 Python 中,如果您在這些字符串文字前加上以下字符之一,則該值將變為字符串,而無需擴展轉義序列。
r
R
在處理使用大量反斜杠的字符串時很有用,例如 Windows 路徑和正則表達式模式。
此處提供了以下信息。
- 轉義序列
- 忽略(禁用)原始字符串中的轉義序列
- 將普通字符串轉換為原始字符串:
repr()
- 注意最後的反斜杠。
轉義序列
在 Python 中,無法在普通字符串中表示的字符(例如製表符和換行符)使用帶有反斜杠的轉義序列來描述,類似於 C 語言。下面顯示了轉義序列的示例。
\t
\n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B
忽略(禁用)原始字符串中的轉義序列
...'
,"..."
如果您在此類字符串文字前加上以下內容之一,則該值將變為字符串,而無需擴展轉義序列。這樣的字符串稱為原始字符串。
r
R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB
沒有特殊的類型稱為原始字符串類型,它只是一個字符串類型,等於帶有反斜杠的普通字符串,表示如下\\
print(type(rs))
# <class 'str'>
print(rs == 'a\\tb\\nA\\tB')
# True
在普通字符串中,轉義序列被視為一個字符,但在原始字符串中,反斜杠也被視為字符。字符串和每個字符的長度如下。
print(len(s))
# 7
print(list(s))
# ['a', '\t', 'b', '\n', 'A', '\t', 'B']
print(len(rs))
# 10
print(list(rs))
# ['a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B']
窗口路徑
當您想將 Windows 路徑表示為字符串時,使用原始字符串很有用。
Windows 路徑由反斜杠分隔,因此如果使用普通字符串,則必須按如下方式對路徑進行轉義,但如果使用原始字符串,則可以按原樣編寫。這些值是等效的。\\
path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True
請注意,以奇數個反斜杠結尾的字符串將導致錯誤,如下所述。在這種情況下,必須將字符串寫入普通字符串,或者通過僅將字符串末尾寫入普通字符串來將其連接起來。
path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True
使用 repr() 將普通字符串轉換為原始字符串
如果要將普通字符串轉換為忽略(禁用)轉義序列的原始字符串,可以使用內置函數 repr()。
s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'
repr() 返回的是一個表示對象的字符串,它與傳遞給 eval() 時的值相同,帶有前導和尾隨字符。
print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]
使用切片,我們可以得到一個與附加了 r 的原始字符串等價的字符串。
s_r2 = repr(s)[1:-1]
print(s_r2)
# a\tb\nA\tB
print(s_r2 == rs)
# True
print(r'\t' == repr('\t')[1:-1])
# True
注意最後的反斜杠。
由於反斜杠緊隨其後的引用字符轉義,因此如果字符串末尾有奇數個反斜杠,則會發生錯誤。偶數個反斜杠是可以的。
# print(r'\')
# SyntaxError: EOL while scanning string literal
print(r'\\')
# \\
# print(r'\\\')
# SyntaxError: EOL while scanning string literal