Мне просто интересно, как люди здесь подойдут к этой проблеме.
Я бы хотел использовать парсер.
Я считаю, что операция, которую вы пытаетесь выполнить, - это не просто синтаксическая или лексическая замена . Это гораздо больше преобразования грамматика , что подразумевает понимание структуры вашего документа .
В вашем примере вы не просто заключаете каждую строку между <li>
и </li>
; вы также рекурсивно заключаете некоторые блоки документа, которые занимают несколько строк, если они представляют собой «элемент».
Возможно, вы могли бы собрать регулярное выражение, способное уловить интерпретирующую логику и рекурсивный характер проблемы, но сделать это было бы все равно, что вырыть траншею чайной ложкой: вы могли бы сделать это, но использование лопаты (парсера) - гораздо более логичный выбор.
Дополнительной причиной использования парсера является "реальное слово" . Regex - это настоящие "грамматические нацисты": сбой в вашей разметке, и они не сработают. С другой стороны, все библиотеки синтаксического анализатора являются «гибкими» (обрабатывают одинаково разные варианты написания, например <a></a>
и <a/>
или HTML <br>
и XHTML <br/>
), а некоторые - например, beautifulsoup - даже «прощающий», означающий, что они попытаются угадать (с удивительно высоким уровнем точности), что автор документа хотел закодировать, даже если сам документ не прошел проверку.
Кроме того, решение, основанное на синтаксическом анализаторе, гораздо более поддерживаемо , чем решение на основе регулярных выражений. Небольшое изменение в структуре вашего документа может потребовать радикальных изменений вашего регулярного выражения [которые по своей природе становятся неясными для их самого автора через 72 часа или около того].
Наконец, поскольку вы используете python и , поэтому readability counts
, решение, основанное на синтаксическом анализаторе, может потенциально привести к гораздо большему количеству кода на pythonic, чем к очень сложному / длинному / неясному регулярному выражению.
НТН!