使用原始字符串忽略(禁用)Python中的轉義序列

商業

...',"..."在 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