
本文介绍在 Python 中如何利用正则表达式(配合捕获组)从非标准、非嵌套的类 HTML 文本中准确提取指定标签(如 )之间的有效内容,避免贪婪匹配导致的误提取。
本文介绍在 python 中如何利用正则表达式(配合捕获组)从非标准、非嵌套的类 html 文本中准确提取指定标签(如 `
在处理半结构化文本(例如含简易 HTML 标签但不符合完整 HTML 规范的文档)时,常遇到类似 <document>...内容...</document> 这样的成对标签。关键限制是:标签不嵌套、格式不严格、无需完整解析器。此时,re.findall() 是轻量高效的选择——但必须正确使用捕获组(capturing group),否则会返回包含标签的整个匹配串,而非纯文本内容。
原始代码的问题在于正则表达式 r"<document>.*?</document>" 仅做匹配,未提取内部文本。只需将目标内容用圆括号包裹,形成捕获组 (.*?),re.findall() 即自动返回该组捕获的内容:
import re
with open('data.txt', 'r', encoding='utf-8') as f:
text = f.read()
# 使用捕获组提取标签内文本(非贪婪匹配)
matches = re.findall(r"<document>(.*?)</document>", text, re.DOTALL)
for content in matches:
print(content.strip()) # .strip() 去除首尾空白,提升可读性✅ 关键要点说明:
-
(.*?):(...)定义捕获组;.*?是非贪婪模式,确保匹配到最近的闭合标签,避免跨标签误捕; -
re.DOTALL标志使.可匹配换行符,保证多行内容被完整捕获; - 若文件含多个
<document></document>段落,此方法会逐一提取每一组内容(因题目明确“无嵌套”,故无需递归处理); - ⚠️ 注意:此方案仅适用于标签简单、无嵌套、无属性、无转义的场景。若文本含复杂 HTML(如
<document id="1"></document>、<实体、嵌套标签等),应改用BeautifulSoup或html.parser等专用解析器,避免正则失效或安全风险。
总结:面对轻量级、可控的类 HTML 文本提取任务,正则捕获组是简洁可靠的首选;核心在于理解 findall 对捕获组的特殊行为——它优先返回组内内容,而非整个匹配字符串。
立即学习“前端免费学习笔记(深入)”;



















