Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在单引号原始字符串文字中转义单引号的混淆_Python_Regex_String - Fatal编程技术网

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'
    前缀时,反斜杠后面的字符将包含在字符串中而不作更改,并且所有反斜杠都保留在字符串中。例如,字符串literal
    r“\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)'