Python原始string和尾部反斜杠

我偶尔碰到过一些东西,想知道这是一个Python“bug”还是至less是一个错误。 我很好奇,如果有人知道这种行为的任何理由。 我刚才想到的就是阅读“python编码”,到目前为止一直很愉快。 我只熟悉Python的2.x行。

原始string是以r为前缀的string。 这很好,因为我可以在正则expression式中使用反斜杠,而且我不需要在任何地方翻倍。 在Windows上编写一次性脚本也很方便,所以我也可以在那里使用反斜杠。 (我知道我也可以使用正斜杠,但是一次性脚本通常包含从Windows中其他地方剪切和粘贴的内容。)

很好! 当然,除非你真的想让你的string以反斜杠结尾。 在“原始”string中没有办法做到这一点。

 In [9]: r'\n' Out[9]: '\\n' In [10]: r'abc\n' Out[10]: 'abc\\n' In [11]: r'abc\' ------------------------------------------------ File "<ipython console>", line 1 r'abc\' ^ SyntaxError: EOL while scanning string literal In [12]: r'abc\\' Out[12]: 'abc\\\\' 

所以在结束引用之前的一个反斜杠是一个错误,但是两个反斜杠给你两个反斜杠! 当然,我不是唯一被这个困扰的人吗?

关于为什么“原始”string是“原始的,除了反斜杠”? 我的意思是,如果我想在那里embedded一个单引号,我只是在string周围使用双引号,反之亦然。 如果我想要两个,我只是三倍的报价。 如果我真的想在原始string中连续使用三个引号,那么我想我必须处理,但是这被认为是“正确的行为”?

这在Windows中的文件夹名称尤其有问题,其中反斜杠是path分隔符。

这是一个常见问题 。

而对于“你真的希望你的字符串以反斜杠结束,在'原始'字符串中没有办法做到这一点。”:FAQ显示了如何解决这个问题。

 >>> r'ab\c' '\\' == 'ab\\c\\' True >>> 

原始字符串主要用于为正则表达式编写可读的模式,这些模式从不需要尾随的反斜杠。 这是一个意外,他们可能会派上用场的Windows(在大多数情况下,你可以使用正斜杠 – 微软C语言库是Python的基础)。 (几乎)不可能写出一个包含单引号双引号的正则表达式模式,只是为了加强这个事故。

(“近乎”,因为三重引用几乎可以帮助…但是有时候可能会有点痛苦)。

所以,是的,原始字符串被设计为表现这种方式(禁止奇数的反斜杠),并且认为是完全“正确的行为”,让他们尊重Guido在发明他们时做出的设计决定;-)。

另一种解决方法是:

  >>> print r"Raw \with\ trailing backslash\\"[:-1] Raw \with\ trailing backslash\ 

关于为什么“原始”字符串是“原始的,除了反斜杠”? 我的意思是,如果我想在那里嵌入一个单引号,我只是在字符串周围使用双引号,反之亦然。

但是这会引发一个问题,为什么原始字符串是“原始的”,除了嵌入的引号?

你必须有一些转义机制,否则你永远不能在字符串中使用外部引号字符。 然后你需要一个转义机制的转义机制。