为什么我不能用一个反斜杠结束一个原始string?

我很困惑,即使原始string将每个\转换为\\但是当这个\出现在最后它会引发错误。

 >>> r'so\m\e \te\xt' 'so\\m\\e \\te\\xt' >>> r'so\m\e \te\xt\' SyntaxError: EOL while scanning string literal 

更新:

现在, Python常见问题中也包含了这一点: 为什么原始string(rstring)不能以反斜杠结尾?

你仍然需要"逃避'"原始string,否则python解释器不知道string停在哪里,在你的例子中,你正在逃避closures'

除此以外:

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

看看语法突出显示我的意思。

原始string不能以单个反斜杠结束,因为parsing器的工作原理(虽然没有实际的转义)。 解决方法是之后将反斜杠添加为非原始string文字:

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

不漂亮,但它的作品。 您可以添加加号,使其更清楚发生的情况,但这不是必需的:

 >>> print(r'foo' + '\\') foo\ 

Pythonstring分两步处理:

  1. 首先标记器查找结束报价。 当它这样做的时候,它会识别反斜杠,但不会解释它们 – 它只是查找一串string元素,后面跟着closures引号标记,其中“string元素”是(不是反斜杠,结束引号或一个字符换行符,换行符不允许换行符),或者(反斜线,后跟任何单个字符)。

  2. 然后解释string的内容(反斜杠转义被处理),取决于它是什么样的string。 string前面的r标志只影响这一步。

https://docs.python.org/3.4/reference/lexical_analysis.html#literals报价:;

即使在原始文字中,引号也可以用反斜线转义,但反斜杠仍然保留在结果中; 例如, r“\”“是一个有效的string文字,由两个字符组成:反斜杠和双引号; r”\“不是有效的string文本(甚至原始string不能以奇数个反斜杠结尾)。具体来说,原始文字不能以单个反斜杠结尾(因为反斜杠会转义下面的引号字符)。还要注意,一个反斜杠后跟一个换行符将被解释为这两个字符作为文字的一部分,而不是作为一个续行。

所以在原始string中, 除了前面的" or ' 之外 ,没有特别的处理反斜杠,所以r'\'或者r"\"不是有效的string,导致右引号转义,导致string无效, r是否存在没有区别,即r'\'等同于'\'r"\"等同于"\"