re.sub 的 repl 函数返回 \1 但不替换组

1 投票
1 回答
903 浏览
提问于 2025-04-18 05:42

我正在尝试为Python中的正则表达式替换操作写一个通用的替换函数(在Python 2和3中都在尝试)。用户可以提供一个正则表达式模式和一个用于匹配的替换内容。这可以是简单的字符串替换,也可以是使用匹配到的组进行替换。

最后,我从用户那里得到一个这样的字典:

regex_dict = {pattern:replacement}

当我尝试通过这个命令替换所有模式的出现时,替换对于组号的替换是有效的,(比如 \1),我调用了以下操作:

re.sub(pattern, regex_dict[pattern], text)

这按预期工作,但当找到匹配时,我需要做额外的事情。基本上,我想实现的目标如下:

replace_function(matchobj):
    result = regex_dict[matchobj.re]
    ##
    ## Do some other things
    ##
    return result

re.sub(pattern, replace_function, text)

我发现这对普通替换有效,但当使用函数时,re.sub并没有利用组的信息来获取匹配。

我还尝试将 \1 模式转换为 \g<1>,希望re.sub能理解,但没有成功。

我是不是漏掉了什么重要的东西?

提前感谢!

附加说明:我使用字节形式编译模式,替换内容也是字节形式。我在模式中有非拉丁字符,但我读取的所有内容都是字节,包括正则表达式替换操作的文本。

编辑 为了澄清,我不知道用户会提供什么样的替换内容。它可能是普通字符串和组的某种组合,或者只是简单的字符串替换。

解决方案

replace_function(matchobj):
    repl = regex_dict[matchobj.re]
    ##
    ## Do some other things
    ##
    return matchobj.expand(repl)

re.sub(pattern, replace_function, text)

1 个回答

0

我猜你想要的是 .expand。如果你有一个编译好的正则表达式对象(比如说),你可以提供一个字符串来进行替换,比如:

import re

text = 'abc'
# This would be your key in the dict
rx = re.compile('a(\w)c') 
# This would be the value for the key (the replacement string, eg: `\1\1\1`)
res = rx.match(text).expand(r'\1\1\1') 
# bbb

撰写回答