Python原始字符串和尾部反斜杠

时间:2010-05-20 02:53:43

标签: python windows escaping

我曾经碰过一些东西,想知道这是一个Python“bug”还是至少是一个错误。我很好奇是否有人知道这种行为的任何理由。我刚想起了“像Python一样的代码”,到目前为止一直很愉快。我只熟悉2.x系列的Python。

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

太好了!当然,除非你真的希望你的字符串以反斜杠结尾。在“原始”字符串中无法做到这一点。

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\\\\'

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

为什么'原始'字符串是'原始的,除了反斜杠引用'?我的意思是,如果我想在那里嵌入单引号,我只是在字符串周围使用双引号,反之亦然。如果我想要两者,我只是三重引用。如果我真的想在原始字符串中连续使用三个引号,那么,我想我必须处理,但这被认为是“正确的行为”吗?

对于Windows中的文件夹名称,这尤其成问题,其中反斜杠是路径分隔符。

4 个答案:

答案 0 :(得分:18)

这是一个FAQ

并回应“你真的希望你的字符串以反斜杠结尾。在'原始'字符串中没有办法做到这一点。”:常见问题解答显示了如何解决它。

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

答案 1 :(得分:4)

原始字符串主要用于可读地编写正则表达式的模式,这些模式从不需要尾随反斜杠;对于Windows来说,它们可能会派上用场(在大多数情况下你可以使用正斜杠,这是一个偶然事件 - 作为Python的基础的Microsoft C库接受任何一种形式!)。让(几乎)不可能编写包含单个双引号的正则表达式模式,只是为了加强有关事故,这是不可接受的。

(“几乎”因为三重引用几乎总是有帮助......但有时可能会有点痛苦。)

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

答案 2 :(得分:3)

解决此问题的另一种方法是:

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

答案 3 :(得分:0)

  

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

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

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