Ближайшим, вероятно, является:
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
очень велико и имеется много совпадений (извините, точно не измерены / сравнены оба подхода, поэтому это всего лишь предположение; -).