为什么我不能以反斜杠结尾的方式结束原始字符串?

11
4个回答

10

在原始字符串中,你仍然需要使用 \ 来转义 ' 或者 " ,否则 Python 解析器就无法知道字符串何时结束。在你的示例中,你正在转义闭合的 '

否则:

r'it wouldn\'t be possible to store this string'
r'since it'd produce a syntax error without the escape'

看看语法高亮以了解我的意思。


但是字符串中的反斜杠应该转义它们旁边的字符,而不是简单地转换为\。 - Ashwini Chaudhary
@AshwiniChaudhary:不,对于原始字符串而言,\ 只会转义引号字符。 - Eric
仍然不是单个的 '',因此 SO 将其转换为 '\'。 - Ashwini Chaudhary
3
这个答案是不正确的。在Python 3中,r'''会生成"\'",所以并没有真正转义'。在这种情况下,文档不够清晰,实际上并没有进行转义,只是字符串字面解析导致了错误。 - Lennart Regebro
1
是的,这是两个字面量,只有其中一个是原始的。 :-) - Lennart Regebro
显示剩余4条评论

9

由于解析器的工作方式(实际上并没有进行转义),原始字符串不能以单个反斜杠结尾。解决方法是在后面添加非原始字符串文字中的反斜杠:

```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\

5

在Python中,处理字符串分为两步:

  1. 首先标记器会查找闭合引号。它会识别反斜杠,但不会对其进行解释 - 它只是寻找紧随引号闭合的一系列字符串元素,其中“字符串元素”可以是以下内容之一:(非反斜杠、闭合引号或换行符的字符 - 除了三重引号允许换行),或(反斜杠,后面跟任何一个单个字符)。

  2. 然后根据字符串类型来解释字符串内容(处理转义字符)。在字符串文字前面加上 r 标志只会影响此步骤。


似乎Python扫描器将'r'存储为一个标记,然后继续使用默认字符串处理规则扫描字符串,而不是将反斜杠视为普通字符的规则。这个问题在https://dev59.com/lIrda4cB1Zd3GeqPS_As上有讨论。 - Logic Knight

3
https://docs.python.org/3.4/reference/lexical_analysis.html#literals引用:

即使在原始字面值中,引号也可以用反斜杠进行转义,但反斜杠仍然存在于结果中。例如,r"\"" 是一个有效的字符串文字,由两个字符组成:一个反斜杠和一个双引号;r"\"不是有效的字符串文字(即使原始字符串不能以奇数个反斜杠结尾)。特别地,原始字面量不能以单个反斜杠结尾(因为反斜杠将转义以下的引号字符)。还要注意,单个反斜杠后跟换行符被解释为该字面量的一部分,而不是作为行续行。

因此,在原始字符串中,除非在前面有"',否则反斜杠不会被特殊处理。因此,r'\'r"\"不是有效的字符串,因为右引号被转义,从而使字符串文字无效。在这种情况下,r是否存在没有区别,即r'\'等同于'\'r"\"等同于"\"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接