
本文介绍在 Python 中利用正则表达式(配合捕获组与 re.DOTALL 标志)安全、高效地提取唯一成对出现的自定义 HTML 标签(如 )之间的纯文本内容,适用于非嵌套、结构松散的类 HTML 片段。
本文介绍在 python 中利用正则表达式(配合捕获组与 `re.dotall` 标志)安全、高效地提取唯一成对出现的自定义 html 标签(如 `
在处理非标准或轻量级类 HTML 文本时(例如日志、模板片段或自定义标记格式),我们常遇到标签不规范、无嵌套但存在多个同名起始标签的情况。此时,若直接用 r"<document>.*?</document>" 匹配,re.findall() 返回的是整个匹配字符串(含标签本身),而非标签之间的内容——这正是原问题中“打印出全部内容”的根源。
正确做法是使用捕获组(capturing group):将目标文本区域用圆括号包裹,使 re.findall() 自动返回括号内匹配的内容。关键修改如下:
import re
with open('data.txt', 'r') as f:
text = f.read()
# 使用捕获组 (.*?) 提取 <document> 与 </document> 之间的内容
matches = re.findall(r"<document>(.*?)</document>", text, re.DOTALL)
for content in matches:
print(content.strip()) # .strip() 可选,用于清理首尾空白✅ 为什么这样有效?
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
-
(.*?)是一个非贪婪捕获组,确保只匹配到最近的闭合标签; -
re.DOTALL使.可匹配换行符,支持跨行文本提取; - 因为题目明确“无嵌套标签”,该方案简洁可靠,无需引入重量级解析器(如 BeautifulSoup)。
⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- 此方法不适用于嵌套标签或复杂 HTML(如
<document><section>...</section></document>),此时应改用html.parser或lxml; - 若文本中存在未闭合的
<document></document>,正则可能误截断或漏匹配,建议先做简单校验(如统计开/闭标签数量); - 避免用正则解析真实 HTML——W3C 规范下 HTML 具有高度上下文敏感性,正则无法覆盖所有合法变体(如属性、注释、CDATA 等)。
? 总结: 对于结构清晰、无嵌套、标签成对且语义简单的类 HTML 文本,正则捕获组是轻量、高效、可读性强的首选方案。只需牢记:要内容,就加括号;要跨行,就加 re.DOTALL。


















