2011-05-12 10 views
95

¿Cómo puedo reemplazar 'foobar' a 'foo123bar'?python re.sub group: number after number

Esto no funciona:

>>> re.sub(r'(foo)', r'\1123', 'foobar') 
'J3bar' 

Esto funciona:

>>> re.sub(r'(foo)', r'\1hi', 'foobar') 
'foohibar' 

Creo que es un problema común: número después de \ número. ¿Alguien puede darme un punto sobre cómo manejar esto?

+0

Esta pregunta se ha agregado a [Preguntas frecuentes sobre la expresión regular de desbordamiento de pila] (http://stackoverflow.com/a/22944075/2736496), debajo de "Grupos". – aliteralmind

Respuesta

167

La respuesta es:

re.sub(r'(foo)', r'\g<1>123', 'foobar') 

extracto relevante de los docs:

Además de escapes de caracteres y backreferences como se describe anteriormente, \ g utilizará la subcadena emparejado por el nombre de grupo llamado, como definido por la sintaxis (? P ...). \ g usa el número de grupo correspondiente; \ g < 2> es por lo tanto equivalente a \ 2, pero no es ambiguo en un reemplazo como \ g < 2> 0. \ 20 se interpretaría como una referencia al grupo 20 de , no como una referencia al grupo 2 seguido del carácter literal '0'. La referencia posterior \ g < 0> sustituye en toda la subcadena que coincide con RE.

+6

Esto es exactamente lo que quiero. Debería leer el documento con más cuidado. Gracias. – zhigang

+17

No seas tan duro contigo mismo. Está [enterrado en la documentación] (https://docs.python.org/2/library/re.html#module-contents) tan profundo que a la mayoría de la gente le tomaría mucho más tiempo leer los documentos que googlearlos. pregunta y que esta respuesta surja en SO. – speedplane

+3

Para el caso, gracias por eso, traté de encontrarlo en los documentos, pero no lo hice, así que llegué a esta respuesta. – Dakkaron

Cuestiones relacionadas