You need to enable JavaScript to run this app. Python基于re模块正则精准提取首个<p>标签内文本的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

Python基于re模块正则精准提取首个<p>标签内文本的实现方法

问题根因说明

你之前使用的正则 <p>(.*)<\/p> 出现跨段匹配的核心原因是默认贪婪匹配规则:量词 * 会尽可能多地捕获符合条件的字符,导致匹配从第一个 <p> 开始,一直吃到整个文本中最后一个 </p> 前的所有内容,不会在第一个闭合标签处终止。

实现方案

核心调整是将贪婪匹配改为非贪婪匹配,给量词 * 增加 ? 修饰符,让匹配尽可能少捕获字符,碰到第一个闭合 </p> 就停止。

基础场景(p标签无属性)

适配普通无属性的 <p>内容</p> 结构,完整可运行代码:

import re

# 模拟多段FIFA主题的<p>包裹文本
html_text = "<p>FIFA是国际足球联合会的缩写,负责组织世界杯等顶级赛事</p><p>FIFA世界排名是各国足球队的官方排名依据</p><p>FIFA年度奖项用于表彰年度表现突出的球员和教练</p>"

# re.search 返回第一个匹配到的对象,group(1) 提取第一个捕获组的内容
first_p_content = re.search(r'<p>(.*?)</p>', html_text).group(1)
print(first_p_content)

输出结果:FIFA是国际足球联合会的缩写,负责组织世界杯等顶级赛事

适配p标签带属性的场景

如果p标签携带类名、ID等属性(例如 <p class="fifa-intro">内容</p>),需要调整正则先匹配p标签的完整开头,避免误匹配:

import re

# 带属性的p标签示例文本
html_text_with_attr = '<p class="fifa-basic" id="para1">FIFA成立于1904年,总部现位于瑞士苏黎世</p><p>后续介绍段落内容</p>'

# 正则说明:[^>]* 匹配p标签内所有非>的属性内容
first_p_content = re.search(r'<p[^>]*>(.*?)</p>', html_text_with_attr).group(1)
print(first_p_content)

适配内容含换行的场景

如果p标签内的文本包含换行符,默认正则中的 . 不会匹配换行,需要增加 re.DOTALL 标志:

import re

# 含换行的p标签示例文本
html_text_with_newline = "<p>FIFA是国际足球联合会的缩写\n负责组织世界杯等顶级赛事</p><p>第二段内容</p>"

# 增加 flags=re.DOTALL 让 . 匹配所有字符(包括换行)
first_p_content = re.search(r'<p>(.*?)</p>', html_text_with_newline, flags=re.DOTALL).group(1)
print(first_p_content)

注意事项

如果你的待处理文本是全量HTML转义后的(p标签本身也被转义为&lt;p&gt;、&lt;/p&gt;),只需将正则中的标签部分替换为对应转义字符即可,例如使用正则 r'&lt;p&gt;(.*?)&lt;/p&gt;'。


内容的提问来源于stack exchange,提问作者user14257643

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 22:24:08