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

时间:2014-05-07 17:45:43

标签: python regex replace numbers regex-group

我正在尝试为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 :(得分:0)

我怀疑你在.expand之后,如果你有一个编译的正则表达式对象(例如),你可以提供一个字符串来考虑替换,例如:< / p>

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