我在这里感到困惑,尽管原始字符串将每个\
转换为\\
,但当这个\
出现在结尾时会引发错误。
>>> r'so\m\e \te\xt'
'so\\m\\e \\te\\xt'
>>> r'so\m\e \te\xt\'
SyntaxError: EOL while scanning string literal
更新:
现在这也包含在 Python 常见问题 中:为什么原始字符串(r-strings)不能以反斜杠结尾?
我在这里感到困惑,尽管原始字符串将每个\
转换为\\
,但当这个\
出现在结尾时会引发错误。
>>> r'so\m\e \te\xt'
'so\\m\\e \\te\\xt'
>>> r'so\m\e \te\xt\'
SyntaxError: EOL while scanning string literal
更新:
现在这也包含在 Python 常见问题 中:为什么原始字符串(r-strings)不能以反斜杠结尾?
在原始字符串中,你仍然需要使用 \
来转义 '
或者 "
,否则 Python 解析器就无法知道字符串何时结束。在你的示例中,你正在转义闭合的 '
。
否则:
r'it wouldn\'t be possible to store this string'
r'since it'd produce a syntax error without the escape'
看看语法高亮以了解我的意思。
由于解析器的工作方式(实际上并没有进行转义),原始字符串不能以单个反斜杠结尾。解决方法是在后面添加非原始字符串文字中的反斜杠:
```python path = r'C:\some\path' + '\\' ```>>> print(r'foo\')
File "<stdin>", line 1
print(r'foo\')
^
SyntaxError: EOL while scanning string literal
>>> print(r'foo''\\')
foo\
不太美观,但它能工作。你可以添加加号来使其更清楚地表明正在发生什么,但这并非必要:
>>> print(r'foo' + '\\')
foo\
在Python中,处理字符串分为两步:
首先标记器会查找闭合引号。它会识别反斜杠,但不会对其进行解释 - 它只是寻找紧随引号闭合的一系列字符串元素,其中“字符串元素”可以是以下内容之一:(非反斜杠、闭合引号或换行符的字符 - 除了三重引号允许换行),或(反斜杠,后面跟任何一个单个字符)。
然后根据字符串类型来解释字符串内容(处理转义字符)。在字符串文字前面加上 r
标志只会影响此步骤。
即使在原始字面值中,引号也可以用反斜杠进行转义,但反斜杠仍然存在于结果中。例如,r"\"" 是一个有效的字符串文字,由两个字符组成:一个反斜杠和一个双引号;r"\"不是有效的字符串文字(即使原始字符串不能以奇数个反斜杠结尾)。特别地,原始字面量不能以单个反斜杠结尾(因为反斜杠将转义以下的引号字符)。还要注意,单个反斜杠后跟换行符被解释为该字面量的一部分,而不是作为行续行。
因此,在原始字符串中,除非在前面有"
或'
,否则反斜杠不会被特殊处理。因此,r'\'
或r"\"
不是有效的字符串,因为右引号被转义,从而使字符串文字无效。在这种情况下,r
是否存在没有区别,即r'\'
等同于'\'
,r"\"
等同于"\"
。
\
只会转义引号字符。 - Eric并没有真正转义
'。在这种情况下,文档不够清晰,实际上并没有进行转义,只是字符串字面解析导致了错误。 - Lennart Regebro