【发布时间】:2023-03-27 09:29:01
【问题描述】:
如果存在进行递归替换的正则表达式操作,例如:
>>> import re
>>> pattern = re.compile(r'[?!]')
>>> s = 'what the?!'
>>> print(pattern.sub(r' \g<0> ', s))
what the ? !
有没有办法撤消递归操作?
我有这个但是没用:
>>> import re
>>> pattern = re.compile(r'[?!]')
>>> s2 = pattern.sub(r' \g<0> ', s)
>>> s2
'what the ? ! '
>>> pattern2 = re.compile(r'\s[?!]\s')
>>> s3 = pattern2.sub(r'\g<0>', s2)
>>> s3
'what the ? ! '
>>> pattern2 = re.compile(r' [?!] ')
>>> s3 = pattern2.sub(r'\g<0>', s2)
>>> s3
'what the ? ! '
【问题讨论】:
-
Regex101 解释得最好 =) regex101.com/r/WMP7zC/1
-
你编译
pattern2,然后用pattern子编译? -
在您的 regex101 链接中,您显示
\g<0>在搜索模式中递归子模式,但您在替换模式中使用它(它只是一个文字反向引用)。您还混合了 PCRE 和 python 模式。 -
这里没有递归,顺便说一句。在 Python 中,
\g<N>是一种明确的替换反向引用语法。它不是 PCRE/Oniguruma 子例程调用语法。你应该重新考虑标题。实际上,由于在进行初始替换的位置没有标记,因此无法“撤消”正则表达式替换。但是,下面的解决方案应该适用于这种情况。只需使用r' ([?!]) '模式并替换为'\1'。
标签: python regex string recursion substitution