más cercano es probablemente:
somere.sub(lambda m: replacements[m.group()], text)
por ejemplo:
>>> 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
en lugar de []
-indexing si desea proporcionar un valor predeterminado para partidos que faltan en replacements
.
Editar: lo que Rick realmente quiere es tener un dict con claves para tomarse como patrones de expresiones regulares, como '\d+S'
, y (con suerte) valores de cadena constantes (con suerte sin referencias hacia atrás). La receta de libro de cocina puede ser adaptado para este fin:
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)
Ejemplo del uso:
d={'\d+S': 'wot', '\d+T': 'zap'}
t='And 23S, and 45T, and 66T but always 029S!'
print dict_sub(d, t)
emite:
And wot, and zap, and zap but always wot!
Se podría evitar la construcción de lookup
y sólo tiene que utilizar mo.expand(d.values()[mo.lastindex-1])
, pero que podría ser un poco lento si d
es muy grande y hay muchas coincidencias (lo siento, no he medido/evaluado con precisión ambos enfoques, así que esto es Solo una suposición;-).
Esto sólo admite una expresión regular, creo que se puede No es más simple que la función que obtuve de ActiveState en caso de que realmente desee un reemplazo y un dict de patrones. ¿Puedes? –
Para realizar varias sustituciones de cadenas en una sola pasada, me gusta esa receta, es por eso que la elegí para el Python Cookbook, consulte http://books.google.com/books?id=Q0s6Vgb98CQC&pg=PA38&dq=xavier+defrang&ei=k5okSvPbNILClQSk2LWvBw (Creo que la discusión que Anna y yo agregamos agrega cierto valor, pero estoy parcializado por supuesto). Estaba tratando de responder más directamente a la pregunta exacta que se me hizo: una RE completamente general y un dado dado de reemplazos. –
Creo que la pregunta original es mejor respondida por la receta, porque el preg_replace de PHP acepta tanto regexps como reemplazos. –