print r'c:\problem Files\foo''\\'
那么问题来了,为什么后面要有两条反斜线呢?
1.链接:https://www.zhihu.com/question/28332958/answer/135206878。
以上答案说的都不太对,其实是因为raw并不是取消了所有的转义,Python规定的raw字符串非常奇怪,非常让人崩溃,它是有转义机制的,只是会转义成原始的字符,我们来看一下官方文档原文:
Even in a raw literal, quotes can be escaped with a backslash, but thebackslash remains in the result; for example, r"\"" is a valid stringliteral 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 ofbackslashes). Specifically,a raw literal cannot end in a single backslash(since the backslash would escape the following quote character). Note alsothat a single backslash followed by a newline is interpreted as those twocharacters as part of the literal,notas a line continuation.
也就是说,raw字符串仍然按照有转义的方式解析,但所有应当转义的字符都转义成了反斜杠 + 被转义字符,也就是说和转义前保持不变,但是仅有一个地方不一样,就是引号的转义:
r'\'' == '\\\''
这个引号仍然被转义了,但是是转义成反斜杠 + 引号。这是Python的raw字符串一个非常奇怪的特征。
Python的反斜杠可以跟任意字符,对有效的转义字符来说会变成转义字符,对无效的转义字符来说会保留反斜杠,因此对于大多数情况来说并没有可以感知的区别,但是问题就在于如果字符串以奇数个反斜杠结束,最后多出来的一个反斜杠就会转移到结束的引号,这就出问题了,所以Python的raw字符串不能以奇数个反斜杠结束。所以在题主的题目中,这个以反斜杠结束的字符串是用两部分拼起来的:不以反斜杠结束的部分 + 反斜杠。后面一个字符串不是raw string,所以用普通的转义方式,写两个反斜杠。
另一个特例是回车符,大部分人应该不知道Python可以在字符串中转义回车符:
'abc\def'# 'abcdef'
跑到raw字符串当中就变成了
r'abc\def'# 'abc\\\ndef'
反斜杠保留,回车符也保留
网友评论