najbliżej jest chyba:
somere.sub(lambda m: replacements[m.group()], text)
na przykład:
>>> za = re.compile('z\w')
>>> za.sub(lambda m: dict(za='BLU', zo='BLA')[m.group()], 'fa za zo bu')
'fa BLU BLA bu'
z .get
zamiast []
-indexing jeśli chcesz dostarczyć domyślne meczów, których brakuje w replacements
.
Edycja: Rick naprawdę chce mieć dyktando z kluczami, które należy wziąć za wzorce regularnego wyrażania, takie jak '\d+S'
i (mam nadzieję) wartościami stałych łańcuchów (miejmy nadzieję, że backreferences). Przepis Cookbook można zaadaptować do tego celu:
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)
Przykład użycia:
d={'\d+S': 'wot', '\d+T': 'zap'}
t='And 23S, and 45T, and 66T but always 029S!'
print dict_sub(d, t)
emituje:
And wot, and zap, and zap but always wot!
Można uniknąć budowania lookup
i po prostu użyć mo.expand(d.values()[mo.lastindex-1])
, ale to może być odrobinę powolne, jeśli d
jest bardzo duże i jest wiele dopasowań (przepraszam, nie dokładnie mierzyłem/porównywałem oba podejścia, więc to jest tylko przypuszczenie ;-).
obsługuje tylko jeden regex, myślę, że można nie będzie łatwiejsze niż funkcja, którą złapałem z ActiveState, na wypadek gdybyś chciał zarówno zamienników, jak i wzorów. Czy możesz? –
Aby wykonać kilka substytucji ciągów w jednym przebiegu, podoba mi się ten przepis, dlatego wybrałem go dla Cookbook Pythona, zobacz http://books.google.com/books?id=Q0s6Vgb98CQC&pg=PA38&dq=xavier+defrang&ei=k5okSvPbNILClQSk2LWvBw (Myślę, że dyskusja, którą dodaliśmy do Anny, dodała pewną wartość, ale jestem oczywiście stronnicza). Próbowałem odpowiedzieć bardziej bezpośrednio na dokładnie zadane pytanie - całkowicie ogólną RE i dany dyktat zastępowania. –
Myślę, że oryginalne pytanie lepiej odpowiada przepisowi, ponieważ preg_replace w PHP akceptuje zarówno wiele wyrażeń regularnych, jak i zamienników. –