più vicino è probabilmente:
somere.sub(lambda m: replacements[m.group()], text)
ad esempio:
>>> za = re.compile('z\w')
>>> za.sub(lambda m: dict(za='BLU', zo='BLA')[m.group()], 'fa za zo bu')
'fa BLU BLA bu'
con un .get
invece di []
-indexing se si vuole fornire un default per le partite che mancano in replacements
.
Edit: ciò rick vuole davvero è quello di avere un dict con le chiavi per essere presi come modelli di espressioni regolari, come ad esempio '\d+S'
, e (si spera) costanti i valori di stringa (si spera w/o backreference). La ricetta ricettario può essere adattata per questo scopo: uso
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)
Esempio:
d={'\d+S': 'wot', '\d+T': 'zap'}
t='And 23S, and 45T, and 66T but always 029S!'
print dict_sub(d, t)
emette:
And wot, and zap, and zap but always wot!
Si potrebbe evitare la costruzione lookup
e basta usare mo.expand(d.values()[mo.lastindex-1])
, ma che potrebbe essere un po 'lento se d
è molto grande e ci sono molte corrispondenze (mi dispiace, non ho misurato con precisione/benchmark entrambi gli approcci, quindi questo è solo una supposizione;-).
Questo supporta solo un'espressione regolare, penso che si può Andare più semplice della funzione che ho preso da ActiveState nel caso in cui in realtà si desidera sia una sostituzione e un pattern dettato. Puoi? –
Per eseguire diverse sostituzioni di stringhe in una passata, mi piace quella ricetta, ecco perché l'ho scelta per il Cookbook di Python, vedi http://books.google.com/books?id=Q0s6Vgb98CQC&pg=PA38&dq=xavier+defrang&ei=k5okSvPbNILClQSk2LWvBw (Penso che la discussione che Anna e io abbiamo aggiunto aggiunga qualche valore, ma ovviamente sono di parte). Stavo cercando di rispondere più direttamente alla domanda esatta - una RE completamente generale e un dittato di sostituzioni. –
Penso che la risposta alla domanda originale sia la ricetta, perché il preg_replace di PHP accetta sia regex che sostituzioni. –