以下按预期方式工作:
>>> 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的正则表达式的字符串表示。如果它有所作为,我在Mac OS X上使用Python 2.7.5(10.9,Mavericks)。
答案 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)'