Подтвердить что ты не робот

Соответствие регулярных выражений между двумя строками?

Я не могу найти способ извлечь все комментарии, как в следующем примере.

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

блок с two -- -- скорее всего не соответствует из-за плохого регулярного выражения. Может кто-то, пожалуйста, укажите мне в правильном направлении, как извлечь совпадения между двумя строками.


Привет, я протестировал то, что вы, ребята, предложили в комментариях... вот работающее решение с небольшим обновлением.

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

спасибо!

4b9b3361

Ответ 1

это должно сделать трюк

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

Ответ 2

В общем случае невозможно выполнить произвольное сопоставление между двумя разделителями с регулярной грамматикой .

В частности, если вы разрешаете вложенность,

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

вы столкнетесь с проблемами. Таким образом, хотя вы можете решить эту конкретную проблему с помощью регулярного выражения, любое регулярное выражение, которое вы пишете, может быть нарушено каким-либо другим странным вложением комментариев.

Чтобы разобрать произвольные комментарии, вам нужно перейти к методу синтаксического анализа контекстных бесплатных грамматик. Простым методом для этого является использование pushdown automaton.