python re.sub group: número después de \ número

183

¿Cómo puedo reemplazar foobarcon foo123bar?

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 cuando se tiene algo así \number. ¿Alguien puede darme una pista sobre cómo manejar esto?

zhigang
fuente
2
Esta pregunta se ha agregado a las Preguntas frecuentes sobre Expresión regular de desbordamiento de pila , en "Grupos".
aliteralmind
1
Esta pregunta me llevó bastante tiempo encontrarla, porque no presenta los términos 'grupo de captura' o 'referencia de grupo numerada', pero eventualmente estoy aquí y me alegra que la haya preguntado.
Mark Ch
1
Su problema es que r '\ 112' se interpreta como el literal octal 0112, ASCII'J 'o el decimal 74. No puedo ver cómo forzar la referencia' \ 1 'para que se evalúe antes de la concatenación de cadenas o''.join()
smci
una pequeña desviación de la pregunta, ¿alguna forma de referir todas las coincidencias de grupo, es decir, r '\ <para todas las coincidencias> hola?
Sayan Dey

Respuestas:

313

La respuesta es:

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

Extracto relevante de los documentos:

Además de los escapes de caracteres y las referencias inversas como se describió anteriormente, \ g utilizará la subcadena que coincida con el nombre del grupo, como se define en 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, no una referencia al grupo 2 seguido del carácter literal '0'. La referencia inversa \ g <0> sustituye en toda la subcadena emparejada por el RE.

John Gaines Jr.
fuente
48
No seas tan duro contigo mismo. Está oculto en la documentación tan profunda que le tomaría a la mayoría de las personas mucho más tiempo leer los documentos que buscar en Google su pregunta y que esta respuesta aparezca en SO.
Speedplane
1
La cita exacta proporcionada se encuentra aquí en caso de que esté buscando contexto
patrick
¿Puedo tomar el grupo y modificarlo? \ g <1> ... Por ejemplo, en este caso g <1> es foo, pero quiero cambiar la o por ti, como este "fuu"
Eric Bellet