para - patrones expresiones regulares python
¿Coincidencia de expresiones regulares entre dos cadenas? (2)
Parece que no puedo encontrar una manera de extraer todos los comentarios como en el siguiente ejemplo.
>>> import re
>>> string = ''''''
... <!-- one
... -->
... <!-- two -- -- -->
... <!-- three -->
... ''''''
>>> m = re.findall ( ''<!--([^/(-->)]+)-->'', string, re.MULTILINE)
>>> m
['' one /n'', '' three '']
el bloque con two -- --
no coincide probablemente debido a una expresión regular incorrecta. ¿Puede alguien, por favor, indicarme 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 operativa 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!
En general, es imposible hacer una correspondencia arbitraria entre dos delimitadores con una gramática regular .
Específicamente, si permites el anidamiento,
<!-- how do you deal <!-- with nested --> comments? -->
Usted se encontrará con problemas. Entonces, si bien puede ser capaz de resolver este problema específico con una expresión regular, cualquier expresión regular que escriba podrá ser interrumpida por algún otro anidado extraño de comentarios.
Para analizar comentarios arbitrarios, deberá pasar a un método de análisis de gramáticas libres de contexto . Un método simple para hacerlo es usar un autómata pushdown .
Esto debería funcionar
m = re.findall ( ''<!--(.*?)-->'', string, re.DOTALL)