为什么我不能用反斜杠结束原始字符串?

时间:2012-06-23 08:40:32

标签: python string rawstring

我在这里很困惑,即使原始字符串会将每\转换为\\,但当此\出现在最后时会引发错误。

>>> r'so\m\e \te\xt'
'so\\m\\e \\te\\xt'

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

更新

Python FAQs现在也涵盖了这一点:Why can’t raw strings (r-strings) end with a backslash?

4 个答案:

答案 0 :(得分:10)

您仍然需要\在原始字符串中转义'",否则python解释器不会知道字符串停止的位置。在您的示例中,您正在逃避结束'

否则:

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

查看语法高亮显示我的意思。

答案 1 :(得分:6)

原始字符串不能以单个反斜杠结尾,因为解析器的工作原理(尽管没有实际的转义)。解决方法是在之后添加反斜杠作为非原始字符串文字:

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

不漂亮,但它有效。您可以添加加号以使其更清晰,但没有必要:

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

答案 2 :(得分:3)

Python字符串分两步处理:

  1. 首先,tokenizer会查找结束语。它在执行此操作时会识别反斜杠,但不会解释它们 - 它只是查找一系列字符串元素,后跟结束引号,其中“字符串元素”是(不是反斜杠的字符,结束引号或者换行符 - 除了三行引号中的换行符外),或(反斜杠,后跟任何单个字符)。

  2. 然后根据字符串的类型解释字符串的内容(处理反斜杠转义)。字符串文字前面的r标志仅影响此步骤。

答案 3 :(得分:2)

引自https://docs.python.org/3.4/reference/lexical_analysis.html#literals

  

即使在原始文字中,也可以使用反斜杠转义引号,但是   反斜杠仍然在结果中;例如, r&#34; \&#34;&#34;是一个有效的字符串   文字由两个字符组成:反斜杠和双引号;   R&#34; \&#34;不是有效的字符串文字(即使原始字符串不能以   奇数个反斜杠)。具体来说,原始文字无法结束   一个反斜杠(因为反斜杠会逃脱以下   引用字符)。还要注意单个反斜杠后跟一个   newline被解释为这两个字符作为文字的一部分,   不是一个续行。

因此,在原始字符串中,在 for (j=0;j<=length2;j++) { total2+=(m[j]-'0')*pow(b,length2-1); length2--; } printf("%d %d",total,total2); return 0; } "之前,反斜杠不会被特别处理, 除了 。因此,'r'\'不是有效字符串,因为右引号被转义,从而使字符串文字无效。在这种情况下,r"\"是否存在没有区别,即r等同于r'\''\'等同于r"\"