Я смущен о жадных/не-жадных персонажах питона.
"Учитывая многострочный html, верните последний тег в каждой строке".
Я бы подумал, что это будет правильно:
re.findall('<.*?>$', html, re.MULTILINE)
Я раздражен, потому что ожидал список отдельных тегов, таких как:
"</html>", "<ul>", "</td>".
Мой O'Reilly Pocket Reference говорит, что *?
wil "соответствуют 0 или более раз, но в кратчайшие сроки."
Итак, почему я получаю "жадные" совпадения, т.е. Более одного тега в некоторых (но не во всех) матчах?
Ваша проблема связана с тем, что у вас есть привязка конца строки ('$'). То, как нежелательное соответствие работает, заключается в том, что вначале движок ищет первый непринужденный шаблон в строке ("<" в вашем случае). Затем он ищет первый символ ">" (который вы ограничили, с $ anchor, который находится в конце строки). Таким образом, не жадный * не отличается от жадного * в этой ситуации.
Поскольку вы не можете удалить "$" из своего RE (вы ищете окончательный тег на линии), вам нужно будет придерживаться другого подхода... см. Ответ @Mark. '<[^> <] *> $' будет работать.