2010-06-17 14 views
7
>>> s = 'foo: "apples", bar: "oranges"' 
>>> pattern = 'foo: "(.*)"' 

Quiero ser capaz de sustituir en el grupo como este:cómo sustituir en un grupo de expresiones regulares en Python

>>> re.sub(pattern, 'pears', s, group=1) 
'foo: "pears", bar: "oranges"' 

¿Hay una buena manera de hacer esto?

+2

Su patrón utiliza el operador codicioso '*', lo que significa que obtendrá el partido más largo que pueda encontrar, lo que significa que en. su caso, el grupo será "manzanas", barra: "naranjas". Está buscando '(. *?)' – abyx

Respuesta

9

Para mí funciona algo así como:

rx = re.compile(r'(foo: ")(.*?)(".*)') 
s_new = rx.sub(r'\g<1>pears\g<3>', s) 
print(s_new) 

Aviso ? in re, por lo que termina con la primera ", también se dio cuenta " en los grupos 1 y 3, ya que deben estar en la salida.

En lugar de \g<1> (o \g<number>) se puede utilizar solo \1, pero recuerde que debe utilizar cadenas "en bruto" y que forma g<1> es preffered porque \1 podría ser ambigua (buscar ejemplos en Python doc).

0
re.sub(r'(?<=foo: ")[^"]+(?=")', 'pears', s) 

La expresión coincide con una secuencia de caracteres que

  • sigue la cadena de foo: ",
  • no contiene comillas dobles y
  • es seguido por "

(?<=) y (?=) son lookbehind and lookahead

Esta expresión regular fallará si el valor de foo contiene cuñas escapadas. Utilice el siguiente para su captura también:

re.sub(r'(?<=foo: ")(\\"|[^"])+(?=")', 'pears', s) 

Código de ejemplo

>>> s = 'foo: "apples \\\"and\\\" more apples", bar: "oranges"' 
>>> print s 
foo: "apples \"and\" more apples", bar: "oranges" 
>>> print re.sub(r'(?<=foo: ")(\\"|[^"])+(?=")', 'pears', s) 
foo: "pears", bar: "oranges" 
+0

Esto devuelve ''foo:" pears "'' – Iacopo

+0

@lacopo Eso fue un error de tipeo con la expresión regular actualizada. Reemplazó '[^ =]' con '[^"] '. Se advirtió que esto fallaría si el valor de' foo' contiene comillas escapadas. – Amarghosh

+0

@lacopo actualizó la expresión regular para manejar también las comillas dobles escapadas. – Amarghosh

Cuestiones relacionadas