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?


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.