代码之家  ›  专栏  ›  技术社区  ›  dash-tom-bang

python原始字符串和尾随反斜杠

  •  24
  • dash-tom-bang  · 技术社区  · 15 年前

    我偶然遇到一个东西,想知道它是一只巨蟒的“虫子”,还是至少是一种不健康的东西。我很好奇是否有人知道这种行为的任何理由。我刚刚想到要读“像蟒蛇一样的代码”,到目前为止这已经很有趣了。我只熟悉Python的2.x行。

    原始字符串是前缀为 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\\\\'
    

    所以右引号前的一个反斜杠是错误的,但是两个反斜杠给了你两个反斜杠!当然,我不是唯一一个为此烦恼的人?

    想一想为什么“raw”字符串是“raw”,除了反斜杠引号?我的意思是,如果我想在其中嵌入一个单引号,我只需要在字符串周围使用双引号,反之亦然。如果我两者都要,我只需要三倍的报价。如果我真的想要一行三个引号在一个原始字符串中,那么,我想我必须处理,但这是否被认为是“适当的行为”?

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

    4 回复  |  直到 11 年前
        1
  •  18
  •   John Machin Santi    15 年前

    这是一个 FAQ .

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

    >>> r'ab\c' '\\' == 'ab\\c\\'
    True
    >>>
    
        2
  •  4
  •   Alex Martelli    15 年前

    原始字符串主要是为了可读地编写正则表达式的模式,而正则表达式不需要尾随的反斜杠;它们可能在Windows中很方便(在大多数情况下,您都可以使用正斜杠--以Python为基础的Microsoft C库接受这两种形式!).使(几乎)不可能编写包含两个单一表达式的正则表达式模式是不可接受的。 双引号,只是为了加强所讨论的事故。

    “几乎”因为三重报价几乎总是有帮助…但有时会有点疼)。

    所以,是的,原始字符串被设计成这样的行为(禁止尾随反斜杠的奇数),并且它 被认为是完全“适当的行为”,让他们尊重guido在发明它们时所做的设计决策;-)。

        3
  •  3
  •   GravityWell    11 年前

    另一种解决方法是:

     >>> print r"Raw \with\ trailing backslash\\"[:-1]
     Raw \with\ trailing backslash\
    
        4
  •  0
  •   user207421    14 年前

    想一想为什么“raw”字符串是“raw”,除了反斜杠引号?我 意思是,如果我想在里面嵌入一个单引号,我就用double 在字符串周围加引号,反之亦然。

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

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

    推荐文章