【问题标题】:re.sub repl function returning \1 does not replace the groupre.sub repl 函数返回 \1 不会替换组
【发布时间】: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


【解决方案1】:

我怀疑你在.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

【讨论】:

  • 谢谢!它现在似乎正在工作,为了完整起见,下面是我所做的更改: replace_function(matchobj): repl = regex_dict[matchobj.re] ## ## Do some other things ## return matchobj.expand(repl) re.sub(pattern, replace_function, text)
猜你喜欢
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2013-08-02
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多