【问题标题】:Confusion escaping single quotes in a single-quoted raw string literal混淆在单引号原始字符串文字中转义单引号
【发布时间】:2013-11-18 10:39:07
【问题描述】:

以下按预期工作:

>>> print re.sub('(\w)"(\W)', r"\1''\2", 'The "raw string literal" is a special case of a "string literal".')
The "raw string literal'' is a special case of a "string literal''.

因为我想在 替换表达式 中使用单引号(这是正确的术语吗?),我使用双引号引用它。

但是为了我的启发,我尝试在 替换表达式中使用单引号,但无法理解结果:

>>> print re.sub('(\w)"(\W)', r'\1\'\'\2', 'The "raw string literal" is a special case of a "string literal".')
The "raw string literal\'\' is a special case of a "string literal\'\'.

这两种形式不应该产生完全相同相同的输出吗?

所以,我的问题是:

  1. 如何在单引号原始字符串中转义单引号?
  2. 如何在双引号原始字符串中转义双引号?
  3. 为什么在re.sub() 的第一个参数中我不必使用原始字符串,但在第二个参数中我必须使用。对于这个 Python 菜鸟来说,两者似乎都是正则表达式的字符串表示形式。

如果有影响,我在 Mac OS X(10.9,Mavericks)上使用 Python 2.7.5。

【问题讨论】:

    标签: python regex string


    【解决方案1】:

    不,他们不应该。原始字符串文字确实可以让您转义引号,但将包含反斜杠:

    >>> r"\'"
    "\\'"
    

    其中 Python 将生成的字符串作为字符串文字回显,反斜杠已转义。

    这是原始字符串文字语法的明确记录的行为:

    当存在'r''R' 前缀时,反斜杠后面的字符将原样包含在字符串中,并且所有反斜杠都保留在字符串中。例如,字符串文字 r"\n" 由两个字符组成:一个反斜杠和一个小写字母 'n'。字符串引号可以用反斜杠转义,但反斜杠保留在字符串中;例如,r"\"" 是由两个字符组成的有效字符串文字:反斜杠和双引号; r"\" 不是有效的字符串文字(即使是原始字符串也不能以奇数个反斜杠结尾)。

    如果您没有对第二个参数使用原始字符串文字,Python 会将 \digit 组合解释为八进制字节值:

    >>> '\0'
    '\x00'
    

    你可以在没有原始字符串文字的情况下通过加倍反斜杠来构造相同的字符串:

    >>> '\\1\'\'\\2'
    "\\1''\\2"
    

    【讨论】:

      【解决方案2】:

      回答OP的问题:

      如何在单引号原始字符串中转义单引号?

      这是不可能的,除非你有单引号前面有反斜杠的特殊情况(正如 Martijn 指出的那样)。

      如何在双引号原始字符串中转义双引号?

      见上文。

      为什么在 re.sub() 的第一个参数中我不必使用原始字符串,但在第二个参数中我必须使用。对于这个 Python 菜鸟来说,两者似乎都是正则表达式的字符串表示形式。

      完成 Martijn 的回答(仅涵盖第二个参数):第一个参数中的反斜杠被尝试解释为转义字符及其后续字符,因为字符串不是原始的。但是,由于以下字符不会与反斜杠一起形成有效的转义序列,因此反斜杠被解释为一个字符:

      >>> '(\w)"(\W)'
      '(\\w)"(\\W)'
      >>> '(\t)"(\W)'
      '(\t)"(\\W)'
      

      【讨论】:

        猜你喜欢
        • 2015-02-12
        • 2023-04-02
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多