re.sub 的 repl 函数返回 \1 但不替换组
我正在尝试为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