Ответ 1
это должно сделать трюк
m = re.findall ( '<!--(.*?)-->', string, re.DOTALL)
Я не могу найти способ извлечь все комментарии, как в следующем примере.
>>> 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 ']
спасибо!
это должно сделать трюк
m = re.findall ( '<!--(.*?)-->', string, re.DOTALL)
В общем случае невозможно выполнить произвольное сопоставление между двумя разделителями с регулярной грамматикой .
В частности, если вы разрешаете вложенность,
<!-- how do you deal <!-- with nested --> comments? -->
вы столкнетесь с проблемами. Таким образом, хотя вы можете решить эту конкретную проблему с помощью регулярного выражения, любое регулярное выражение, которое вы пишете, может быть нарушено каким-либо другим странным вложением комментариев.
Чтобы разобрать произвольные комментарии, вам нужно перейти к методу синтаксического анализа контекстных бесплатных грамматик. Простым методом для этого является использование pushdown automaton.