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