从技术上讲,任何奇数个反斜杠,如文档中所述.
>>> r'\' File "", line 1 r'\' ^ SyntaxError: EOL while scanning string literal >>> r'\\' '\\\\' >>> r'\\\' File " ", line 1 r'\\\' ^ SyntaxError: EOL while scanning string literal
似乎解析器可以将原始字符串中的反斜杠视为常规字符(不是原始字符串的全部内容吗?),但我可能遗漏了一些明显的东西.TIA!
我在粗体突出显示的那一部分解释了原因:
字符串引号可以使用反斜杠进行转义,但反斜杠仍保留在字符串中; 例如,
r"\""
是一个有效的字符串文字,由两个字符组成:反斜杠和双引号;r"\"
不是有效的字符串文字(即使原始字符串不能以奇数个反斜杠结尾).具体来说,原始字符串不能以单个反斜杠结尾(因为反斜杠会转义以下引号字符).另请注意,后跟换行符的单个反斜杠被解释为字符串的一部分,而不是行连续符.
所以原始字符串不是100%原始的,还有一些基本的反斜杠处理.
关于python原始字符串的整个误解是,大多数人认为反斜杠(在原始字符串中)只是一个常规字符,就像所有其他字符串一样.它不是.理解的关键是这个python的教程序列:
当存在' r '或' R '前缀时,字符串中包含反斜杠后面的字符没有更改,并且所有反斜杠都保留在字符串中
因此反斜杠后面的任何字符都是原始字符串的一部分.一旦解析器输入一个原始字符串(非unicode一个)并遇到反斜杠,它就会知道有2个字符(反斜杠和后面的字符).
这条路:
r'abc\d'包括a,b,c,\,d
r'abc \'d'包括a,b,c,\,',d
r'abc \''包括a,b,c,\,'
和:
r'abc \'包含a,b,c,\,'但现在没有终止引用.
最后一个案例显示,根据文档现在,解析器无法找到结束引用,因为您在上面看到的最后一个qoute是字符串的一部分即.反斜杠不能在这里持续,因为它会"吞噬"字符串结束字符.
它就是这样儿的!我认为它是python中的一个小缺陷!
我认为这不是一个很好的理由,但绝对不能解析; 用\作为最后一个字符解析原始字符串真的很容易.
问题是,如果你允许\成为原始字符串中的最后一个字符,那么你将无法将"置于原始字符串中.似乎python继续允许"而不是允许\作为最后一个字符.
但是,这不应该造成任何麻烦.
如果您担心无法轻松编写Windows文件夹路径(例如,请c:\mypath\
不要担心),因为您可以将它们表示为r"C:\mypath"
,并且,如果您需要附加子目录名称,请不要使用字符串连接,无论如何,这不是正确的方法!使用os.path.join
>>> import os >>> os.path.join(r"C:\mypath", "subfolder") 'C:\\mypath\\subfolder'
另一个技巧是使用chr(92),因为它的计算结果为"\".
我最近不得不清理一串反斜杠,以下是诀窍:
CleanString = DirtyString.replace(chr(92),'')
我意识到这并没有关注"为什么",但线程吸引了许多人寻找解决当前问题的方法.
为了让你用斜杠结束原始字符串,我建议你可以使用这个技巧:
>>> print r"c:\test"'\\' test\
由于在原始字符串中允许使用\",因此它不能用于标识字符串文字的结尾.
当你遇到第一个"?"时为什么不停止解析字符串文字?
如果是这种情况,那么\"将不允许在字符串文字中.但它确实如此.