web-dev-qa-db-fra.com

Regex correspondant entre deux chaînes?

Je n'arrive pas à trouver un moyen d'extraire tous les commentaires comme dans l'exemple suivant.

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

bloquer avec two -- -- ne correspond probablement pas en raison d'une mauvaise expression régulière. Quelqu'un peut-il m'indiquer dans la bonne direction comment extraire des correspondances entre deux chaînes.


Salut, j'ai testé ce que vous avez suggéré dans les commentaires .... voici une solution de travail avec peu de mise à niveau.

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

merci!

18
Hrvoje Špoljar

cela devrait faire l'affaire

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

En général, il est impossible de faire une correspondance arbitraire entre deux délimiteurs avec un grammaire normale .

Plus précisément, si vous autorisez l'imbrication,

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

vous rencontrerez des problèmes. Ainsi, bien que vous puissiez résoudre ce problème spécifique avec une expression régulière, toute expression régulière que vous écrivez pourra être interrompue par une autre imbrication étrange de commentaires.

Pour analyser des commentaires arbitraires, vous devrez passer à une méthode d'analyse grammaires sans contexte . Pour ce faire, une méthode simple consiste à utiliser un automate déroulant .

3
Wilduck