
本文介绍如何通过正则表达式匹配而非分割,准确提取包含起始与结束标签的完整 html 片段(如 `
`、`
- …
`),确保标签结构完整、内容不被截断,并说明其适用边界与专业替代方案。
在处理 html 片段时,若目标是按特定成对标记(如
、
- …
、
…
等)切分字符串并保留完整标签结构,直接使用 re.split() 会破坏标签配对关系——它仅在标签处断开,导致起始/结束标签被分离,内容错位。正确做法是改用 re.finditer() 进行匹配(match),主动捕获“开–闭”成对出现的完整标签块。
核心正则表达式如下:
import re pattern = r"<(p|li|ul|ol|dl|h1|h2|h3|h4|h5|h6)>[^<]*1>" subject = ' Some text some text.
Another text
立即学习“前端免费学习笔记(深入)”;
. some list . another list
' matches = [match.group(0) for match in re.finditer(pattern, subject, re.DOTALL)] print(matches) # 输出: # [' Some text some text.
', ' Another text
立即学习“前端免费学习笔记(深入)”;
', ' some list ', ' another list
']
✅ 关键设计解析:
- (p|li|ul|ol|dl|h1|…|h6):捕获组,限定支持的成对标签名;
- [^
- 1>:反向引用,确保闭合标签与开头标签名称严格一致(如
- 必须对应
- re.DOTALL:使 . 可匹配换行符,支持多行内容;
);
⚠️ 重要限制与注意事项:
- 此正则仅适用于简单、规范、无嵌套的单层标签(例如
text
✅,但
- item
❌ —— 因 [^);
- 不支持自闭合标签(如
)、属性(如
)、注释或 CDATA;- 真实 HTML 文档中强烈建议使用 dom 解析器(如 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(str(tag))? 总结:
正则匹配成对标签是一种轻量级、可控的文本预处理手段,适用于已知结构简单的 HTML 片段(如 cms 导出内容、模板片段)。但一旦涉及嵌套、动态属性或容错需求,务必转向专业 HTML 解析库——正则不是 HTML 的朋友,DOM 才是。