混淆在单引号原始字符串文字中转义单引号

时间:2013-11-18 10:39:08

标签: python regex string

以下按预期方式工作:

>>> 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的正则表达式的字符串表示。
  4. 如果它有所作为,我在Mac OS X上使用Python 2.7.5(10.9,Mavericks)。

2 个答案:

答案 0 :(得分:5)

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

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

其中Python将结果字符串作为字符串文字回显,并使用反斜杠转义。

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

  

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

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

>>> '\0'
'\x00'

您可以使用反斜杠加倍来构造相同的字符串,而不使用原始字符串文字:

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

答案 1 :(得分:2)

回答OP的问题:

  

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

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

  

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

见上文。

  

为什么在re.sub()的第一个参数中我不必使用原始字符串,但在第二个参数中我必须这样做。两者看起来都像是这个Python noob的正则表达式的字符串表示。

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

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