¿Cómo usar la expresión regular de python para reemplazar usando el grupo capturado?

Supongamos que quiero cambiar the blue dog and blue cat wore blue hats al the gray dog and gray cat wore blue hats .

Con sed pude lograr esto de la siguiente manera:

 $ echo 'the blue dog and blue cat wore blue hats' | sed 's/blue \(dog\|cat\)/gray \1/g' 

¿Cómo puedo hacer un reemplazo similar en Python? He intentado:

 >>> import re >>> s = "the blue dog and blue cat wore blue hats" >>> p = re.compile(r"blue (dog|cat)") >>> p.sub('gray \1',s) 'the gray \x01 and gray \x01 wore blue hats' 

Necesitas escapar de tu barra invertida:

 p.sub('gray \\1', s) 

como alternativa, puede utilizar una cadena sin formato como ya hizo para la expresión regular:

 p.sub(r'gray \1', s) 

Como estaba buscando una respuesta similar; pero queriendo usar grupos nombrados dentro del reemplazo, pensé que agregaría el código para otros:

 p = re.compile(r'blue (?Pdog|cat)') p.sub(r'gray \g',s) 

Prueba esto:

 p.sub('gray \g<1>',s) 

Fuera de tema, para grupos de captura numerados:

 #/usr/bin/env python import re re.sub( pattern=r'(\d)(\w+)', repl='word: \\2, digit: \\1', string='1asdf' ) 

word: asdf, digit: 1

Python usa una barra invertida literal, más un índice basado en uno para realizar reemplazos numerados de grupos de captura, como se muestra en este ejemplo. Entonces, \1 , ingresado como '\\1' , hace referencia al primer grupo de captura (\d) , y \2 al segundo grupo capturado.