Python正则表达式转义运算符\在替换&;原始字符串

Python正则表达式转义运算符\在替换&;原始字符串,python,regex,substitution,backslash,rawstring,Python,Regex,Substitution,Backslash,Rawstring,我不理解python正则表达式中scape操作符\与原始字符串的r'一起工作的逻辑。 谢谢你的帮助 代码: 该理论说: 反斜杠字符(“\”),表示特殊形式或允许在不调用特殊含义的情况下使用特殊字符 正如问题末尾提供的链接所解释的,r'代表原始字符串,也就是说,符号没有特殊意义,它就是这样 因此,在上面的正则表达式中,我希望text2和text3是不同的,因为文本2中的替换文本是“.”,即句点,而(原则上)文本3中的替换文本是r“.”,这是一个原始字符串,即应该显示的字符串、反斜杠和句点。但它们的

我不理解python正则表达式中scape操作符\与原始字符串的r'一起工作的逻辑。 谢谢你的帮助

代码:

该理论说: 反斜杠字符(“\”),表示特殊形式或允许在不调用特殊含义的情况下使用特殊字符

正如问题末尾提供的链接所解释的,r'代表原始字符串,也就是说,符号没有特殊意义,它就是这样

因此,在上面的正则表达式中,我希望text2和text3是不同的,因为文本2中的替换文本是“.”,即句点,而(原则上)文本3中的替换文本是r“.”,这是一个原始字符串,即应该显示的字符串、反斜杠和句点。但它们的结果是一样的:

结果是:

text0=  esto  .es  10  . er - 12 .23 with [  and.Other ] here is more ; puntuation
text1=  esto.es  10. er- 12.23 with [  and.Other ] here is more; puntuation
text2=  esto\.es  10\. er - 12\.23 with [  and.Other ] here is more ; puntuation
text3=  esto\.es  10\. er - 12\.23 with [  and.Other ] here is more ; puntuation
#text2=text3 but substitutions are not the same r'\.' vs '\.'
在我看来,r'在替换部分和反斜杠中的工作方式不同。另一方面,我的直觉告诉我,我遗漏了一些东西

编辑1: 在@Wiktor Stribiżew评论之后。 他指出(根据他的链接):

其中:

ab
a6b
这让我更加困惑

注: 我读过关于原始字符串的堆栈溢出问题,它是超完整的。然而,它并没有从(我的重点)提到替换:

re.sub(模式、应答、字符串、计数=0、标志=0) 返回字符串 通过替换 替换repl的字符串中的模式。如果找不到模式, 字符串返回时保持不变。repl可以是字符串或函数;如果 它是一个字符串,其中的任何反斜杠转义都将被处理。也就是说,\n 已转换为单个换行符,\r已转换为 回车,等等。ASCII字母的未知转义是 保留供将来使用,并作为错误处理其他未知逃逸 例如\&被单独保留。反向引用,例如\6,被替换 子串与模式中的第6组匹配

repl参数不仅仅是纯文本。它也可以是一个函数的名称或引用组中的位置(例如
\g
\g
\1

此外,来自:

与标准C不同,所有未识别的转义序列都保留在 字符串保持不变,即结果中保留反斜杠

由于
不是特殊的转义字符,
'\.
r'\.

相同(我的重点是):

re.sub(模式、应答、字符串、计数=0、标志=0) 返回字符串 通过替换 替换repl的字符串中的模式。如果找不到模式, 字符串返回时保持不变。repl可以是字符串或函数;如果 它是一个字符串,其中的任何反斜杠转义都将被处理。也就是说,\n 已转换为单个换行符,\r已转换为 回车,等等。ASCII字母的未知转义是 保留供将来使用,并作为错误处理其他未知逃逸 例如\&被单独保留。反向引用,例如\6,被替换 子串与模式中的第6组匹配

repl参数不仅仅是纯文本。它也可以是一个函数的名称或引用组中的位置(例如
\g
\g
\1

此外,来自:

与标准C不同,所有未识别的转义序列都保留在 字符串保持不变,即结果中保留反斜杠


由于
不是特殊的转义字符,
'\.
r'\.

最重要的是,

replacement patterns ≠ regular expression patterns
我们使用正则表达式模式来搜索匹配项,我们使用替换模式来替换用正则表达式找到的匹配项

注意替换模式中唯一的特殊字符是反斜杠,
\
。只有反斜杠必须加倍。

Python中的替换模式语法

它们提到了可以在替换模式(如
\n
\r
)和正则表达式转义序列(
\6
)中使用的字符串转义序列,以及可以同时用作正则表达式和字符串转义序列(
\&
)的字符串转义序列,这让人感到困惑

我使用术语regex转义序列来表示一个转义序列,该转义序列由一个反斜杠+一个字符组成,即,
'\\X'
r'\X'
,以及一个字符串转义序列来表示一个
\
序列和一个字符或一些共同构成有效字符的序列。他们只在美国被承认。在原始字符串文字中,只能转义
(这就是为什么不能用
\”
结束原始字符串文字,但齿隙仍然是字符串的一部分)

因此,在替换模式中,您可以使用反向引用:

re.sub(r'\D(\d)\D', r'\1', 'a1b')    # => 1
re.sub(r'\D(\d)\D', '\\1', 'a1b')    # => 1
re.sub(r'\D(\d)\D', '\g<1>', 'a1b')  # => 1
re.sub(r'\D(\d)\D', r'\g<1>', 'a1b') # => 1

首先,也是最重要的,

replacement patterns ≠ regular expression patterns
我们使用正则表达式模式来搜索匹配项,我们使用替换模式来替换用正则表达式找到的匹配项

注意替换模式中唯一的特殊字符是反斜杠,
\
。只有反斜杠必须加倍。

Python中的替换模式语法

它们提到了可以在替换模式(如
\n
\r
)和正则表达式转义序列(
\6
)中使用的字符串转义序列,以及可以同时用作正则表达式和字符串转义序列(
\&
)的字符串转义序列,这让人感到困惑

我使用术语regex转义序列来表示一个转义序列,该转义序列由一个反斜杠+一个字符组成,即,
'\\X'
r'\X'
,以及一个字符串转义序列来表示一个
\
序列和一个字符或一些组合在一起的序列
re.sub(r'\D(\d)\D', r'\1', 'a1b')    # => 1
re.sub(r'\D(\d)\D', '\\1', 'a1b')    # => 1
re.sub(r'\D(\d)\D', '\g<1>', 'a1b')  # => 1
re.sub(r'\D(\d)\D', r'\g<1>', 'a1b') # => 1
re.sub(some_regex, some_replacement.replace('\\', '\\\\'), input_string)