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