Python, regex и html: сопоставить последний тег в строке

1

Я смущен о жадных/не-жадных персонажах питона.

"Учитывая многострочный html, верните последний тег в каждой строке".

Я бы подумал, что это будет правильно:

re.findall('<.*?>$', html, re.MULTILINE)

Я раздражен, потому что ожидал список отдельных тегов, таких как:

"</html>", "<ul>", "</td>".

Мой O'Reilly Pocket Reference говорит, что *? wil "соответствуют 0 или более раз, но в кратчайшие сроки."

Итак, почему я получаю "жадные" совпадения, т.е. Более одного тега в некоторых (но не во всех) матчах?

  • 0
    Вы не должны использовать RegEx для анализа HTML. Вы должны использовать (x) html-парсер, такой как BeautifulSoup или minidom.
  • 0
    Посмотрите ответ с наибольшим количеством голосов на этот вопрос: stackoverflow.com/questions/1732348
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Ваша проблема связана с тем, что у вас есть привязка конца строки ('$'). То, как нежелательное соответствие работает, заключается в том, что вначале движок ищет первый непринужденный шаблон в строке ("<" в вашем случае). Затем он ищет первый символ ">" (который вы ограничили, с $ anchor, который находится в конце строки). Таким образом, не жадный * не отличается от жадного * в этой ситуации.

Поскольку вы не можете удалить "$" из своего RE (вы ищете окончательный тег на линии), вам нужно будет придерживаться другого подхода... см. Ответ @Mark. '<[^> <] *> $' будет работать.

  • 0
    Отлично. Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню