我曾经碰过一些东西,想知道这是一个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中的文件夹名称,这尤其成问题,其中反斜杠是路径分隔符。
答案 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 字符串周围的引号,反之亦然。
但那会引发一个问题,为什么原始字符串是'原始的,除了嵌入式引号?'
你必须有一些转义机制,否则你永远不能在字符串中使用外引号字符。然后你需要一个逃生机制的逃生机制。