-1

我正在尝试使用正则表达式来提取给定 HTML 代码行中的开始标签。在以下几行中,我希望在第一行中仅将“body”和“h1”作为开始标签,在第二行中将“html”、“head”和“title”作为开始标签:

我已经尝试使用以下正则表达式来做到这一点:

start_tags = re.findall(r'<(\w+)\s*.*?[^\/]>',line)

'<body data-modal-target class=\'3\'><h1>Website</h1><br /></body></html>'
'<html><head><title>HTML Parser - II</title></head>'

但是我第一行的输出是:['body','h1','br'],而我不希望捕获'br',因为我排除了'/'。

第二行是['html','title'],而我也希望能抓住'head'。如果您让我知道我的代码的哪一部分是错误的,那将是一种很好的方式?

4

1 回答 1

1

如果您希望使用正则表达式这样做,您可能需要逐步设计多个不同的表达式。您可以使用 OR 管道连接它们,但这可能不是必需的。

用于 h1-h6 标签的 RegEx 1

此链接可帮助您捕获不包括身体和头部的身体标签:

(<(.*)>(.*)</([^br][A-Za-z0-9]+)>)

您可能希望为其添加更多边界。例如,您可以替换(.*)为 chars 列表[]

在此处输入图像描述

正则表达式电路

链接可帮助您可视化您的表达式:

在此处输入图像描述

RegEx 2 用于头部和身体

对于头部和身体标签,您可能想要滑动新行,您可能需要类似于以下的表达式

(<head>([\s\S]*)<\/head>)|(<body>([\s\S]*)</body>)

在此处输入图像描述

表现

这些表达式相当昂贵,您可能想要简化它们,或者编写一些其他脚本来解析您的 HTML,或者找到一个 HTML 解析器来执行此操作。

于 2019-05-12T19:11:25.867 回答