Python 在单引号原始字符串文字中转义单引号的混淆
以下工作如预期:Python 在单引号原始字符串文字中转义单引号的混淆,python,regex,string,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''.
因为我想在替换表达式中使用单引号(这是正确的术语吗?),所以我用双引号引用了它
但出于启发,我尝试在替换表达式中使用单引号,但无法理解结果:
>>> 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\'\'.
这两种形式不应该产生完全相同的输出吗
因此,我的问题是:
re.sub()
的第一个参数中,我不必使用原始字符串,但在第二个参数中,我必须使用原始字符串。对于这个Python noob来说,这两个函数似乎都是正则表达式的字符串表示如果有区别的话,我会在MacOSX上使用Python 2.7.5(10.9,Mavericks)。不,他们不应该这样做。原始字符串文字允许您转义引号,但反斜杠将包括在内:
>>> r"\'"
"\\'"
其中,Python将结果字符串作为字符串文本进行回显,并转义反斜杠
这是原始字符串文字语法的明确记录行为:
当出现'r'
或'r'
前缀时,反斜杠后面的字符将包含在字符串中而不作更改,并且所有反斜杠都保留在字符串中。例如,字符串literalr“\n”
由两个字符组成:反斜杠和小写的'n'
。字符串引号可以用反斜杠转义,但反斜杠仍保留在字符串中;例如,r“\”
是由两个字符组成的有效字符串文字:反斜杠和双引号;r“\”
不是有效的字符串文字(即使是原始字符串也不能以奇数个反斜杠结尾)
如果第二个参数没有使用原始字符串文字,Python会将\digit
组合解释为八进制字节值:
>>> '\0'
'\x00'
通过将反斜杠加倍,可以构造没有原始字符串文字的相同字符串:
>>> '\\1\'\'\\2'
"\\1''\\2"
回答OP的问题: 如何在单引号原始字符串中转义单引号 这是不可能的,除非您有一个特殊情况,即单引号前面有一个反斜杠(正如Martijn指出的) 如何在双引号原始字符串中转义双引号 见上文 为什么在re.sub()的第一个参数中,我不必使用原始字符串,但在第二个参数中,我必须使用原始字符串。对于这个Python noob,这两个参数似乎都是正则表达式的字符串表示 完成Martijn的回答(仅包括第二个参数):试图将第一个参数中的反斜杠与其以下字符一起解释为转义字符,因为字符串不是原始字符串。但是,由于以下字符没有与反斜杠一起形成有效的转义序列,因此反斜杠被解释为字符:
>>> '(\w)"(\W)'
'(\\w)"(\\W)'
>>> '(\t)"(\W)'
'(\t)"(\\W)'