在Python中替换字符串时可以传递字典吗?

时间:2009-06-02 02:38:00

标签: php python regex string

在PHP中,您有preg_replace($patterns, $replacements, $string),您可以通过传递一系列模式和替换来一次性完成所有替换。

Python中的等价物是什么?

我注意到字符串和re函数replace()sub()不接受字典...

根据rick的评论编辑澄清: 我的想法是让一个带有键的字典作为正则表达式模式,例如'\d+S'和(希望)常量字符串值(希望没有后向引用)。现在相应地编辑我的答案(即回答实际问题)。

4 个答案:

答案 0 :(得分:10)

最接近的可能是:

somere.sub(lambda m: replacements[m.group()], text)

例如:

>>> za = re.compile('z\w')
>>> za.sub(lambda m: dict(za='BLU', zo='BLA')[m.group()], 'fa za zo bu')
'fa BLU BLA bu'

使用.get而不是[] - 如果要为replacements中缺少的匹配提供默认值,请编制索引。

编辑:瑞克真正想要的是拥有一个带有键的字典作为正则表达式模式,例如'\d+S'和(希望)常量字符串值(希望没有后向引用)。食谱配方可以用于此目的:

def dict_sub(d, text): 
  """ Replace in 'text' non-overlapping occurences of REs whose patterns are keys
  in dictionary 'd' by corresponding values (which must be constant strings: may
  have named backreferences but not numeric ones). The keys must not contain
  anonymous matching-groups.
  Returns the new string.""" 

  # Create a regular expression  from the dictionary keys
  regex = re.compile("|".join("(%s)" % k for k in d))
  # Facilitate lookup from group number to value
  lookup = dict((i+1, v) for i, v in enumerate(d.itervalues()))

  # For each match, find which group matched and expand its value
  return regex.sub(lambda mo: mo.expand(lookup[mo.lastindex]), text)

使用示例:

  d={'\d+S': 'wot', '\d+T': 'zap'}
  t='And 23S, and 45T, and 66T but always 029S!'
  print dict_sub(d, t)

发射:

And wot, and zap, and zap but always wot!

您可以避免构建lookup并使用mo.expand(d.values()[mo.lastindex-1]),但如果d非常大并且有很多匹配(抱歉,没有精确测量),那可能会有点慢/对两种方法进行基准测试,所以这只是猜测; - )。

答案 1 :(得分:-1)

这是使用reduce

的简单方法
mynewstring=reduce(lambda a,(b,c): a.replace(b, c), mydict.items(), mystring)

答案 2 :(得分:-2)

这很容易做到:

replacements = dict(hello='goodbye', good='bad')
s = "hello, good morning";
for old, new in replacements.items():
    s = s.replace(old, new)

你会发现很多地方PHP函数接受一个值数组而且没有直接的Python等价物,但是在Python中处理数组(列表)要容易得多,所以它不是一个问题。

答案 3 :(得分:-2)

你可以在python中替换字符串时传递字典。 考虑上面的例子:

replacement = {'hello' : 'goodbye', 'good' : 'bad' }

你已经用这种格式写了字符串

s = "%(hello)s, %(good)s morning"
changed_s = s%replacement

changed_s的输出将是

"goodbye, bad morning"