10

I am confused here, even though raw strings convert every \ to \\ but when this \ appears in the end it raises error.

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

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

Update:

This is now covered in Python FAQs as well: Why can’t raw strings (r-strings) end with a backslash?

4

4 回答 4

10

You still need \ to escape ' or " in raw strings, since otherwise the python interpreter doesn't know where the string stops. In your example, you're escaping the closing '.

Otherwise:

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

Look at the syntax highlighting to see what I mean.

于 2012-06-23T08:42:19.047 回答
9

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

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

不漂亮,但它有效。您可以添加加号以使正在发生的事情更清楚,但这不是必需的:

>>> print(r'foo' + '\\')
foo\
于 2012-06-23T14:13:50.687 回答
3

Python 字符串分两步处理:

  1. 首先,标记器查找结束引号。它在执行此操作时识别反斜杠,但不解释它们 - 它只是查找后跟右引号的字符串元素序列,其中“字符串元素”是(不是反斜杠、右引号或换行符 - 除了换行符允许在三引号中),或(反斜杠,后跟任何单个字符)。

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

于 2012-06-23T12:49:47.920 回答
2

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

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

所以在原始字符串中,反斜杠不会被特殊处理,除非"or之前'。因此,r'\'orr"\"不是有效的字符串,因为右引号被转义,从而使字符串文字无效。在这种情况下,是否r存在没有区别,即r'\'等价于'\'r"\"等价于"\".

于 2015-05-17T03:51:28.380 回答