2011-07-15 8 views
32

Supongamos que quiero cambiar the blue dog and blue cat wore blue hats a the gray dog and gray cat wore blue hats.¿Cómo usar la expresión regular de Python para reemplazar el uso del grupo capturado?

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' 

Respuesta

42

tiene que escapar de su barra invertida:

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

Alternativamente, puede utilizar una cuerda en bruto como ya hicieron con la expresión regular:

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

La segunda respuesta es ideal, ya que coincide con la sintaxis 'sed'. –

5

probar este :

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

Bonita alternativa (+1) pero todavía funciona solo porque '\ g' no es un código escapado válido. La forma segura de escribir su código debería ser: 'p.sub ('gris \\ g <1>', s)' – mac

+0

Disculpe, quise decir que era una cadena sin formato. Dejé fuera el argumento de reemplazo también, ¡estaba en racha! Estoy borrando el comentario. Estoy 100% de acuerdo en no contar con el comportamiento demasiado permisivo de Python con respecto a las secuencias de escape. –

+2

@mac Considera añadir tu comentario aquí a tu respuesta. Es lo único que funcionó de manera confiable en el portátil ipython. – bahmait

10

Como estaba buscando una respuesta similar; pero que desean utilizar grupos nombrados dentro de la reemplace, pensé que me gustaría añadir el código para otros:

p = re.compile(r'blue (?P<animal>dog|cat)') 
p.sub(r'gray \g<animal>',s) 
2

Fuera de tema, Para los grupos de captura numeradas:

#/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 hacer reemplazos de grupos de captura numerados, como se muestra en este ejemplo. Por lo tanto, \1, ingresado como '\\1', hace referencia al primer grupo de captura (\d) y \2 al segundo grupo capturado.

Cuestiones relacionadas