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

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

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


当前回答

关于python原始字符串的所有误解是,大多数人认为反斜杠(在原始字符串中)只是一个普通字符。事实并非如此。理解这段python教程的关键是:

当有'r'或'r'前缀时,字母a 反斜杠包含在字符串中而不更改,并且所有 反斜杠留在字符串中

所以任何跟在反斜杠后面的字符都是原始字符串的一部分。一旦解析器输入一个原始字符串(非Unicode字符串)并遇到一个反斜杠,它就知道有两个字符(一个反斜杠和后面的一个字符)。

这种方式:

R 'abc\d'由a, b, c, \, d组成 R 'abc 'd'由a, b, c, \, ', d组成 R 'abc\ "由a, b, c, \, '组成

and:

R 'abc\'由a, b, c, \组成,'但现在没有终止引号了。

最后一个案例表明,根据文档,现在一个解析器无法找到结束引号,因为你看到上面的最后一个引号是字符串的一部分,即反斜杠不能在这里最后,因为它将“吞噬”字符串结束字符。

其他回答

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

但是你可以用:

'\\'

为了让你用斜杠结束一个原始字符串,我建议你可以使用这个技巧:

>>> print r"c:\test"'\\'
test\

它使用Python中字符串字面值的隐式连接,并将一个用双引号分隔的字符串与另一个用单引号分隔的字符串连接起来。丑,但有用。

我遇到过这个问题,并找到了一个部分解决方案,这在某些情况下是很好的。尽管python不能以一个反斜杠结束一个字符串,但它可以序列化并保存在一个文本文件中,结尾是一个反斜杠。因此,如果你需要在你的电脑上保存一个带有反斜杠的文本,这是可能的:

x = 'a string\\' 
x
'a string\\' 

# Now save it in a text file and it will appear with a single backslash:

with open("my_file.txt", 'w') as h:
    h.write(x)

顺便说一句,如果你使用python的json库转储它,它就不能与json一起工作。

最后,我使用Spyder,我注意到,如果我在蜘蛛的文本编辑器中双击变量资源管理器中的名称来打开变量,它会显示一个反斜杠,并且可以以这种方式复制到剪贴板(这对大多数需求不是很有帮助,但可能对一些..)。

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

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%原始的,仍然有一些基本的反斜杠处理。

关于python原始字符串的所有误解是,大多数人认为反斜杠(在原始字符串中)只是一个普通字符。事实并非如此。理解这段python教程的关键是:

当有'r'或'r'前缀时,字母a 反斜杠包含在字符串中而不更改,并且所有 反斜杠留在字符串中

所以任何跟在反斜杠后面的字符都是原始字符串的一部分。一旦解析器输入一个原始字符串(非Unicode字符串)并遇到一个反斜杠,它就知道有两个字符(一个反斜杠和后面的一个字符)。

这种方式:

R 'abc\d'由a, b, c, \, d组成 R 'abc 'd'由a, b, c, \, ', d组成 R 'abc\ "由a, b, c, \, '组成

and:

R 'abc\'由a, b, c, \组成,'但现在没有终止引号了。

最后一个案例表明,根据文档,现在一个解析器无法找到结束引号,因为你看到上面的最后一个引号是字符串的一部分,即反斜杠不能在这里最后,因为它将“吞噬”字符串结束字符。