【发布时间】:2014-05-07 17:45:43
【问题描述】:
我正在尝试为 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,希望re.sub能理解,但无济于事。
我错过了什么重要的东西吗?
提前致谢!
附加说明:我使用字符串编译模式,以字节为单位,替换也以字节为单位。我的模式中有非拉丁字符,但我以字节为单位读取所有内容,包括正则表达式替换将操作的文本。
编辑 澄清一下,我事先不知道用户会提供什么样的替换。它可以是普通字符串和组的某种组合,或者只是字符串替换。
解决方案
replace_function(matchobj):
repl = regex_dict[matchobj.re]
##
## Do some other things
##
return matchobj.expand(repl)
re.sub(pattern, replace_function, text)
【问题讨论】:
-
"但是re.sub在使用函数时没有使用组信息来获取匹配" -- 能详细说明一下吗?您可以从
matchobj.group获取群组信息 -
对于 (r'a(\w)c', r'\1\1\1') 的(模式,替换)对和文本 'abc',我应该是得到'bbb'。这适用于字典查找,但在我使用该函数时不起作用,因为它放置了 '\1\1\1'
标签: python regex replace numbers regex-group