2012-10-04 32 views
17

Parece que no puedo encontrar una manera de extraer todos los comentarios como en el siguiente ejemplo.¿Correspondencia de expresiones regulares entre dos cadenas?

bloque
>>> import re 
>>> string = ''' 
... <!-- one 
... --> 
... <!-- two -- -- --> 
... <!-- three --> 
... ''' 
>>> m = re.findall ('<!--([^\(-->)]+)-->', string, re.MULTILINE) 
>>> m 
[' one \n', ' three '] 

con two -- -- no se corresponde muy probablemente a causa del mal de expresiones regulares. ¿Puede alguien señalarme en la dirección correcta cómo extraer coincidencias entre dos cadenas?


Hola He probado lo que ustedes sugirieron en los comentarios .... aquí está la solución de trabajo con poca actualización.

>>> m = re.findall ('<!--(.*?)-->', string, re.MULTILINE) 
>>> m 
[' two -- -- ', ' three '] 
>>> m = re.findall ('<!--(.*\n?)-->', string, re.MULTILINE) 
>>> m 
[' one \n', ' two -- -- ', ' three '] 

gracias!

+3

cualquier cosa entre [] es un carácter único, por lo que (->) no buscará esa agrupación como parte del problema ... –

+2

're.findall ('', cadena, re.DOTALL)' debería hacer. No necesita '^ \ (->)' aquí, porque el signo de interrogación lo hace no codicioso. – BrtH

+0

¿Parece que está buscando solo las palabras? Si es así, ¿qué pasa con 'm = re.findall ('[\ w] +', cadena, re.MULTILINE)'? Además, la cadena es un nombre realmente malo para una, um, cadena. – Ben

Respuesta

32

esto debe hacer el truco

m = re.findall ('<!--(.*?)-->', string, re.DOTALL) 
+0

gracias por la respuesta rápida y exacta. –

+1

No necesita la bandera MULTILINE. –

+0

@ AlanMoore, gracias, tienes razón. Se actualizó la respuesta – iruvar

3

En general, es imposible hacer juego arbitraria entre dos delimitadores con un regular grammar.

específcamente, si permite la anidación,

<!-- how do you deal <!-- with nested --> comments? --> 

que se encontrará en las cuestiones. Entonces, si bien es posible que pueda resolver este problema específico con una expresión regular, cualquier expresión regular que escriba se podrá romper con alguna otra anidación extraña de comentarios.

Para analizar comentarios arbitrarios, deberá pasar a un método de análisis context free grammars. Un método simple para hacerlo es usar un pushdown automaton.

+1

No creo que los comentarios anidados sean tan comunes. ¿Un poco derrota el punto de comentar si se procesa algo dentro de él? –

+1

Y parece que no son posibles en HTML. http://stackoverflow.com/questions/442786/are-nested-html-comments-possible Voy a dejar esto aquí, porque creo que es importante reconocerlo, pero no espero ningún voto positivo. – Wilduck

+1

Las máquinas de estado finito no pueden analizar gramáticas libres de contexto; podría usar autómatas Pushdown. –

Cuestiones relacionadas