
本文介绍如何精准匹配常见的成对 html 标签(如 `
- `、`
- 内容 或
` 等)及其完整内容,确保开闭标签与中间文本一并捕获,避免 `re.split` 导致标签丢失的问题。
在处理 HTML 片段时,若目标是提取特定成对标签的完整结构(例如
标题
),直接使用 re.split() 会将标签本身作为分隔符丢弃,无法满足“保留标签”的需求。此时应改用 re.finditer() 或 re.findall() 进行匹配(match)而非分割(split)。核心思路是:利用正则中的捕获组 + 反向引用,确保开闭标签名称一致,并匹配二者之间的内容。推荐正则模式如下:
import re
pattern = r"<(p|li|ul|ol|dl|h1|h2|h3|h4|h5|h6)>[^<]*</\1>"
subject = '<p> Some text some text some text. </p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/2624" title="考拉新媒体导航"><img
src="https://img.php.cn/upload/ai_manual/001/246/273/6971fd02ce3b5444.png" alt="考拉新媒体导航" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/2624" title="考拉新媒体导航">考拉新媒体导航</a>
<p>考拉新媒体导航——新媒体人的专属门户网站</p>
</div>
<a href="/ai/2624" title="考拉新媒体导航" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div> <p> Another text another text </p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>. <li> some list </li>. <ul> another list </ul>'
matches = [match.group(0) for match in re.finditer(pattern, subject, re.DOTALL)]
print(matches)
# 输出:
# ['<p> Some text some text some text. </p>',
# '<p> Another text another text </p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>',
# '<li> some list </li>',
# '<ul> another list </ul>']✅ 关键说明:
- (p|li|ul|ol|dl|h1|...) 捕获标签名;
- [^
- \1> 精确匹配对应闭合标签(\1 引用第一个捕获组内容);
- re.DOTALL 使 . 可匹配换行符,提升鲁棒性。
⚠️ 重要注意事项:
- 此正则不支持标签属性(如
)或嵌套结构(如
text
- 对于真实 HTML 文档(含属性、注释、自闭合标签、不规范缩进等),强烈建议使用专业 HTML 解析器(如 BeautifulSoup 或 lxml),例如:
from bs4 import BeautifulSoup
soup = BeautifulSoup(subject, 'html.parser')
for tag in soup.find_all(['p', 'li', 'ul', 'ol', 'dl', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']):
print(tag)✅ 总结:正则适用于可控、结构简单的 HTML 片段提取;生产环境或复杂 HTML,请务必转向 DOM 解析器——它语义准确、容错性强,且天然支持属性遍历、嵌套查询与安全清理。










