我在这里很困惑,即使原始字符串会将每\
转换为\\
,但当此\
出现在最后时会引发错误。
>>> 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?
答案 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字符串分两步处理:
首先,tokenizer会查找结束语。它在执行此操作时会识别反斜杠,但不会解释它们 - 它只是查找一系列字符串元素,后跟结束引号,其中“字符串元素”是(不是反斜杠的字符,结束引号或者换行符 - 除了三行引号中的换行符外),或(反斜杠,后跟任何单个字符)。
然后根据字符串的类型解释字符串的内容(处理反斜杠转义)。字符串文字前面的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"\"
。