【问题标题】:Multiple, specific, regex substitutions in PythonPython 中的多个特定正则表达式替换
【发布时间】:2013-07-11 10:38:21
【问题描述】:

我想做的是在给定的文本中进行特定的替换。例如,'' 应更改为 ']',等等。它类似于此处给出的解决方案: How can I do multiple substitutions using regex in python?,这是

import re 

def multiple_replace(dict, text):
  # Create a regular expression  from the dictionary keys
  regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))

  # For each match, look-up corresponding value in dictionary
  return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text) 

现在,问题是我还想替换正则表达式匹配的模式。例如,我想将 'fo.+' 替换为 'foo' 和 'ba[rz]*' 替换为 'bar'。

删除地图(代码中的 re.escape 有帮助,以便正则表达式实际匹配,但随后我收到关键错误,因为例如,'barzzzzzz' 将是匹配项,并且我想替换一些东西,但是'barzzzzzz' 不是字典中的键,文字字符串 'ba[rz]*' 是。如何修改此函数以使其工作?

(在不相关的注释中,这些“foo”和“bar”是从哪里来的?)

【问题讨论】:

  • 替换文字很容易保持直接,但添加正则表达式作为匹配模式肯定会增加一些潜在的歧义(尤其是因为您可能需要跟踪其中的几十个)。如果您有可能重叠的正则表达式,请注意按预期顺序测试和替换它们。

标签: python regex substitution


【解决方案1】:
import re

def multiple_replace(dict, text):
  # Create a regular expression  from the dictionary keys
  regex = re.compile(r'(%s)' % "|".join(dict.keys()))
  return regex.sub(lambda mo: dict[
      [ k for k in dict if
      re.search(k, mo.string[mo.start():mo.end()])
      ][0]], text)

d = { r'ba[rz]*' : 'bar', '<' : '[' }
s = 'barzzzzzz <'

print multiple_replace(d, s)

给予:

bar [

【讨论】:

    【解决方案2】:

    只需多次调用sub

    在一个不相关的注释中,行话文件来拯救:Metasyntactic variablesfoo

    【讨论】:

    • 多个子调用是一种选择,但当我在整个文本中有几十个不同的替换时就不行了。不过,感谢您的链接!
    • 只是为了正确看待问题-您不喜欢打几十个sub 电话,但是您可以打几千或几百万个search 电话吗? @perreal 的解决方案很好地回答了您的字面问题,但我仍然认为,如果您对其进行基准测试,您可能会发现只进行多次 sub 调用既简单又快捷。
    • ...呵呵。我会尝试对其进行基准测试,但我最初确实认为这种方式会更快。
    • 好吧,我已经对其进行了基准测试。事实证明,multiple_replace 函数比 multiplere.subs 慢得多,而且它似乎随着替换的数量呈指数级增长。
    猜你喜欢
    • 2012-02-16
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多