为什么在Python中使用单个反斜杠的原始字符串会导致语法错误?

7

还可以查看为什么不能以反斜杠结束原始字符串?为什么Python的原始字符串文字不能以单个反斜杠结尾?问题及相关答案。


在我的 Python 2 程序中,我使用了许多包含反斜杠的文本字符串。我可以使用另一个反斜杠来转义这些反斜杠(例如:"red\\blue"),或者使用 Python 原始字符串(例如:r"red\blue")。我已经标准化使用原始字符串方法,在所有情况下都有效,除了其中一种情况。
如果我想表示双斜杠,我可以使用 r"\\",但是如果我试图输入单个反斜杠字面值r"\",Python 就会报语法错误。显然的解决方法是在这种情况下使用 "\\",但是为什么单个原始字符串反斜杠会出错?这是 Python 中的一个错误吗?有没有一种方法可以将单个反斜杠编码为原始字符串?
示例:
>>> r"red\blue"
'red\\blue'
>>> r"\\"
'\\\\'
>>> r"\"
  File "<stdin>", line 1
    r"\"
       ^
SyntaxError: EOL while scanning string literal
>>> 

我更倾向于在整个程序中始终使用原始字符串,并且在多个地方使用"\\"似乎很笨拙。使用r"\\"[0]也不会更好。我还考虑过在程序开头使用常量BACKSLASH,其中BACKSLASH = r"\\"[0]。这是另一种笨拙的方法。
更新: 当原始字符串末尾有奇数个反斜杠时,也会出现此错误。使用的默认字符串扫描器将反斜杠解释为转义字符,因此最后一个反斜杠将转义结束引号字符。旨在嵌入字符串的"',但生成的字符串仍将具有内部的反斜杠作为普通字符。
有几个与此问题相关的问题,但没有答案说明单个反斜杠原始字符串为什么是错误的或如何将单个反斜杠编码为原始字符串:python replace single backslash with double backslash

在Python中无法打印'\'(单个反斜杠)

Python正则表达式将双反斜杠替换为单反斜杠

在Python 3中将双反斜杠转换为单反斜杠

为什么无法以反斜杠结尾的原始字符串?

为什么Python的原始字符串文字不能以单个反斜杠结尾?


2
因为单个反斜杠作为转义字符,用于接下来的双引号。这使得程序认为缺少结束引号。 - Avinash Raj
我发现在原始字符串中包含单个 \ 的最好方法是使用字符串格式化:r"%s" % "\\" 将产生:'\\' - MattDMo
1
@AvinashRaj 感谢您的评论。我仍然在努力理解为什么单个反斜杠不被允许,如果'r'前缀禁用反斜杠的功能并将其视为任何其他字符。也许反斜杠保留了某些功能。嗯。 - Logic Knight
1
@CarpetPython,你在问题中链接的最后一个问答(为什么无法以反斜杠结尾原始字符串?)似乎已经回答了你的问题。在原始字符串中仍然存在带有反斜杠的转义序列,只是数量较少。r"\" 中的 \" 就是其中之一。 - Jonathan Lonowski
2
重复的链接指向 https://docs.python.org/3/faq/design.html#why-can-t-raw-strings-r-strings-end-with-a-backslash,尽管我同意 r'\' 不像你期望的那样工作是令人惊讶和奇怪的。 - tripleee
显示剩余6条评论
1个回答

1
这里的问题很简单,系统假定单个反斜杠用于转义,你正在转义引号,否则你必须转义转义字符。这种情况会在任何允许一个字符禁用另一个字符功能的环境中发生。

3
谢谢Zach。在一个原始字符串中,反斜杠应该只是一个普通字符,为什么它会转义结束引号? - Logic Knight
重复 @LogicKnight 的问题:为什么反斜杠需要转义,当原始字符串的整个目的就是保持原样,换句话说就是不进行任何转义? - Reversed Engineer
而且 print (r'What\'s in a name?') 会输出 What\'s in a name?,因此这里没有进行转义!显然,系统并不认为单个反斜杠是用于转义的,所以这里的问题并不是“简单”的。 - Reversed Engineer
并不是反斜杠“转义了结束引号”; 相反,当 Python 尝试确定闭合引号的位置时,它认为反斜杠和引号组合必须是字符串的一部分,并且引号还不能是字符串的结尾。这是因为,在编译代码时,“这段代码的哪一部分是字符串文字?”的答案在单独步骤中发生,该步骤发生在“这个字符串文字表示的文本是什么?”之前。 - Karl Knechtel

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