单引号原始字符串文字中的单引号转义混乱



以下工作如预期:

>>> 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 noob来说,这两个参数似乎都是正则表达式的字符串表示

如果有什么不同的话,我在Mac OS X(10.9,Mavericks)上使用Python 2.7.5。

不,它们不应该。原始字符串文字确实允许您转义引号,但反斜杠将包括在内:

>>> r"'"
"\'"

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

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

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

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

>>> ''
'x00'

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

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

回答OP的问题:

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

这是不可能的,除非您有特殊情况,其中单引号前面有一个反斜杠(正如Martijn所指出的)。

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

请参见上文。

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

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

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

最新更新