【发布时间】:2015-07-28 18:28:46
【问题描述】:
另请参阅Why can't I end a raw string with a backslash? 和Why can't Python's raw string literals end with a single backslash? 问题和相关答案。
在我的 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
can't print '\' (single backslash) in Python
Python regex to replace double backslash with single backslash
Convering double backslash to single backslash in Python 3
Why can't I end a raw string with a backslash?
Why can't Python's raw string literals end with a single backslash?
【问题讨论】:
-
因为单个反斜杠的作用类似于以下双引号的转义字符。现在它认为没有结束引号。
-
我发现在原始字符串文字中包含单个 \ 的最佳方法是使用字符串格式:
r"%s" % "\\"将产生:'\\'。 -
@AvinashRaj 感谢您的评论。如果'r'前缀禁用反斜杠的功能并像对待任何其他字符一样对待,我仍在努力理解为什么不允许使用单个反斜杠。也许反斜杠保留了一些功能。嗯。
-
@CarpetPython 您在问题中链接到的最后一个问答(Why can't I end a raw string with a backslash?)似乎有您的答案。原始字符串中仍然存在带有反斜杠的转义序列,只是数量较少。
r"\"中的\"是一个。 -
docs.python.org/3/faq/… 上的常见问题解答的重复链接虽然我同意
r'\'不像您预期的那样工作是令人惊讶和奇怪的。
标签: python string syntax-error