Python、正则表达式和html:匹配第行的最终标记

Python、正则表达式和html:匹配第行的最终标记,python,regex,Python,Regex,我对python贪婪/不贪婪的字符感到困惑 给定多行html,返回每行的最终标记 我认为这是正确的: re.findall('<.*?>$', html, re.MULTILINE) re.findall(“$”,html,re.MULTILINE) 我很恼火,因为我期待一个单一标签的列表,如: "</html>", "<ul>", "</td>". ,“,”。 我的O'Reilly的袖珍参考称,*?将“匹配0次或更多次,但次数尽可能少。”

我对python贪婪/不贪婪的字符感到困惑

给定多行html,返回每行的最终标记

我认为这是正确的:

re.findall('<.*?>$', html, re.MULTILINE)
re.findall(“$”,html,re.MULTILINE)
我很恼火,因为我期待一个单一标签的列表,如:

"</html>", "<ul>", "</td>".
,“
    ,”。
我的O'Reilly的袖珍参考称,
*?
将“匹配0次或更多次,但次数尽可能少。”


那么,为什么我会得到“greedier”匹配,即在某些(但不是所有)匹配中有多个标记?

您的问题源于这样一个事实,即您有一个结束线锚(“$”)。非贪婪匹配的工作方式是引擎首先搜索行上的第一个无约束模式(“”字符(您已使用$anchor将其约束在行的末尾)。因此,在这种情况下,非贪婪*与贪婪*没有任何区别


由于您无法从RE中删除“$”(您正在查找一行上的最终标记),因此您需要采取不同的策略…请参阅@Mark的答案。$”将起作用。

您的问题源于您有一个线端锚点(“$”)。非贪婪匹配的工作方式是引擎首先搜索行上的第一个无约束模式(“”字符(您已使用$anchor将其约束在行的末尾)。因此,在这种情况下,非贪婪*与贪婪*没有任何区别


由于您无法从RE中删除“$”(您正在查找一行中的最终标记),因此需要采用不同的策略…请参阅@Mark的答案。“$”将起作用。

您不应该使用正则表达式来解析HTML。您应该使用(x)html解析器,如BeautifulSoup或minidom。请参阅此问题的最热门答案:为了简洁起见,我没有提到我只是想更好地理解正则表达式。我没有意识到我无意中问了一个最常见的错误框架问题。你不应该使用正则表达式来解析html。你应该使用(x)html解析器,如BeautifulSoup或minidom。请看这个问题的投票结果:为了简洁起见,我没有提到我只是为了更好地理解正则表达式而胡闹。我没有意识到我无意中问了一个最常见的错误框架问题。