Python Regex reemplaza instantáneamente grupos

106

¿Hay alguna forma de reemplazar directamente todos los grupos usando la sintaxis de expresiones regulares?

La forma normal:

re.match(r"(?:aaa)(_bbb)", string1).group(1)

Pero quiero lograr algo como esto:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

Quiero construir la nueva cadena instantáneamente a partir de los grupos que Regex acaba de capturar.

mc_kaiser
fuente

Respuestas:

189

Eche un vistazo a re.sub:

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

Esta es la función de sustitución (reemplazo) de expresiones regulares de Python. La cadena de reemplazo puede llenarse con las llamadas referencias inversas (barra invertida, número de grupo) que se reemplazan con lo que coincidieron con los grupos. Los grupos se cuentan de la misma forma que la group(...)función, es decir, comenzando 1de izquierda a derecha abriendo paréntesis.

Martin Ender
fuente
4
¡Mucho más claro que el doc! No entendí cómo estaba trabajando el grupo con este. Deberían agregar ese ejemplo.
Y0da
Funcionó desde la primera vez. Esta es una manera bastante clara de explicarlo. Gracias, ¿puede explicar cómo el subgrupo debería estar llamando de manera adecuada (r(r))r((r)((r)r))?
Rakshitha Muranga Rodrigo
1
@RakshithaMurangaRodrigo Los grupos están numerados de izquierda a derecha, pasando por donde empiezan. Así que si inserto número correcto de cada grupo frente al grupo, estarían ordenados: 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender
@MartinEnder: ¡Muchas gracias!
Rakshitha Muranga Rodrigo
30

La respuesta aceptada es perfecta. Yo agregaría que la referencia de grupo probablemente se logra mejor usando esta sintaxis:

r"\g<1> \g<2>"

para la cadena de reemplazo. De esta manera, evita las limitaciones de sintaxis en las que un grupo puede ir seguido de un dígito. Nuevamente, todo esto está presente en el documento, nada nuevo, solo que a veces es difícil de detectar a primera vista.

Benelgiac
fuente