在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