1

我想做的是在给定的文本中进行特定的替换。例如,'<' 应更改为 '[','>' 应更改为 ']',等等。它类似于此处给出的解决方案: 如何在 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) 

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

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

(在不相关的说明中,这些“foo”和“bar”的东西是从哪里来的?)

4

2 回答 2

2

只需打多个sub电话。

在一个不相关的注释中,行话文件来拯救:元句法变量foo

于 2013-07-11T02:33:28.037 回答
2
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 [
于 2013-07-11T02:38:21.343 回答