从技术上讲,任何奇数个反斜杠,如文档中所述。

>>> r'\'
  File "<stdin>", line 1
    r'\'
       ^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
  File "<stdin>", line 1
    r'\\\'
         ^
SyntaxError: EOL while scanning string literal

解析器似乎只能将原始字符串中的反斜杠视为常规字符(原始字符串不就是这样吗?),但我可能忽略了一些明显的东西。


当前回答

尽管它的作用,即使是原始字符串也不能以单个结尾 反斜杠,因为反斜杠转义了下面的引号 字符—您仍然必须转义周围的引号字符到 将它嵌入到字符串中。也就是r"…“不是一个有效的字符串 字面量——原始字符串不能以奇数个反斜杠结尾。 如果需要用一个反斜杠结束原始字符串,可以使用 两个,切掉第二个。

其他回答

来自C,对我来说很清楚,一个\作为转义字符,允许你把特殊字符,如换行符,制表符和引号放入字符串。

这确实不允许\作为最后一个字符,因为它将转义' '并使解析器阻塞。但正如前面指出的,\是合法的。

原始字符串

原始字符串的简单想法是

如果我在一对引号前加上r, 我可以在引号中间加任何我想加的 它意味着它自己。

不幸的是,这行不通,因为如果 恰好包含引号,原始字符串将在此结束。

我根本不可能把"我想要什么" 在固定的分隔符之间,因为其中一些可能看起来像 终止分隔符——无论该分隔符是什么。

真实世界的原始字符串(变体1)

解决这个问题的一个可能的方法是说

如果我在一对引号前加上r, 我可以在引号中间加任何我想加的 只要它不包含报价 它意味着它自己。

这种限制听起来很严厉,直到人们认识到这一点 Python提供的大量引用可以适应大多数情况 用这个规则。以下都是有效的Python引用:

'
"
'''
"""

分隔符有这么多的可能性,几乎什么都有 可以使之发挥作用。 唯一的例外是如果字符串 字面应该包含所有允许的完整列表 Python引号。

真实世界的原始字符串(变体2,如在Python中)

然而,Python采用了不同的路径,使用 以上规则的扩展版本。 它有效地说明了

如果我在一对引号前加上r, 我可以在引号中间加任何我想加的 只要它不包含报价 它意味着它自己。 如果我坚持要引用一段话,即使这是允许的, 但我必须在它前面加一个反斜杠。

因此,在某种意义上,Python方法更加自由 比上面的变体1 -但它有副作用 "mis"将闭引号解释为字符串的一部分 如果字符串的最后一个字符是反斜杠。

变体2没有帮助:

如果我想在字符串中引用, 但不是反斜杠,是我的字符串字面量的允许版本 都不是我所需要的 然而,鉴于我有三种不同的其他类型的引用 在我的支配下,我可能会选择其中一个,然后我的 问题就解决了,所以这不是问题。 有问题的情况是这样的: 如果我想让我的字符串以反斜杠结束,我就不知所措了。 我需要诉诸于连接一个非原始字符串文字 包含反斜杠。

结论

写完这篇文章后,我和其他几张海报一起去了 这种变体本来更容易理解和接受 因此更加python化。这就是生活!

为什么r'\'是语法不正确的原因是,虽然字符串表达式是原始的,但使用的引号(单引号或双引号)总是必须转义,因为它们将标记引号的结束,否则。因此,如果你想在单引号字符串中表达单引号,除了使用\'没有其他方法。同样适用于双引号。

但是你可以用:

'\\'

原因在这一节中用粗体标出的部分解释了:

String quotes can be escaped with a backslash, but the backslash remains in the string; for example, r"\"" is a valid string literal consisting of two characters: a backslash and a double quote; r"\" is not a valid string literal (even a raw string cannot end in an odd number of backslashes). Specifically, a raw string cannot end in a single backslash (since the backslash would escape the following quote character). Note also that a single backslash followed by a newline is interpreted as those two characters as part of the string, not as a line continuation.

原始字符串不是100%原始的,仍然有一些基本的反斜杠处理。

尽管它的作用,即使是原始字符串也不能以单个结尾 反斜杠,因为反斜杠转义了下面的引号 字符—您仍然必须转义周围的引号字符到 将它嵌入到字符串中。也就是r"…“不是一个有效的字符串 字面量——原始字符串不能以奇数个反斜杠结尾。 如果需要用一个反斜杠结束原始字符串,可以使用 两个,切掉第二个。