Python Regex Sub – Use Match como Dict Key en Sustitución

Estoy traduciendo un progtwig de Perl a Python (3.3). Soy bastante nuevo con Python. En Perl, puedo hacer sustituciones de expresiones regulares astutas, como:

$string =~ s//$params->{$1}/g; 

Esto buscará a través de $string , y para cada grupo de caracteres de la palabra encerrados en , se producirá una sustitución del hashref $params , utilizando la coincidencia de expresiones regulares como la clave de hash.

¿Cuál es la mejor manera (en Pythonic) de replicar de manera concisa este comportamiento? Se me ha ocurrido algo en estas líneas:

 string = re.sub(r'', (what here?), string) 

Podría ser bueno si pudiera pasar una función que asigne coincidencias de expresiones regulares a un dict. ¿Es eso posible?

Gracias por la ayuda.

Puede pasar un llamable to re.sub para decirle qué hacer con el objeto coincidente.

 s = re.sub(r'<(\w+)>', lambda m: replacement_dict.get(m.group()), s) 

el uso de dict.get permite proporcionar un “repliegue” si dicha palabra no está en el dictado de reemplazo, es decir

 lambda m: replacement_dict.get(m.group(), m.group()) # fallback to just leaving the word there if we don't have a replacement 

re.sub que al usar re.sub (y family, es decir, re.split ), cuando se especifican cosas que existen alrededor de su sustitución deseada, a menudo es más limpio usar expresiones de mirada para que las cosas alrededor de su coincidencia no sean eliminadas. . Así que en este caso escribiría tu expresión regular como

 r'(?<=<)(\w+)(?=>)' 

De lo contrario, tendrá que hacer algunos empalmes hacia fuera / atrás en los soportes en su lambda . Para que quede claro de qué estoy hablando, un ejemplo:

 s = "this is stuffthis is other stuff" d = {'othertag': 'blah'} #this doesn't work because `group` returns the whole match, including non-groups re.sub(r'<(\w+)>', lambda m: d.get(m.group(), m.group()), s) Out[23]: 'this is stuffthis is other stuff' #this output isn't exactly ideal... re.sub(r'<(\w+)>', lambda m: d.get(m.group(1), m.group(1)), s) Out[24]: 'sometagthis is stuffblahthis is other stuffclosetag' #this works, but is ugly and hard to maintain re.sub(r'<(\w+)>', lambda m: '<{}>'.format(d.get(m.group(1), m.group(1))), s) Out[26]: 'this is stuffthis is other stuff' #lookbehind/lookahead makes this nicer. re.sub(r'(?<=<)(\w+)(?=>)', lambda m: d.get(m.group(), m.group()), s) Out[27]: 'this is stuffthis is other stuff'