如何使用正则表达式匹配并保留指定 HTML 标签及其内容(而非简单分割)

5次阅读

如何使用正则表达式匹配并保留指定 HTML 标签及其内容(而非简单分割)

本文介绍如何精准匹配常见的成对 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)>[^<]*" subject = '

      Some text some text some text.

      Another 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 some text.

      ', # '

      Another text another text

      立即学习 前端免费学习笔记(深入)”;

      ', # '
    • some list
    • ', # '
        another list
      ']

      关键说明

      • (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 解析器——它语义准确、容错性强,且天然支持属性遍历、嵌套查询与安全清理。

  • text=ZqhQzanResources