You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python正则表达式提取特殊字符间的数字

解决Python正则提取HTML中特定数字的问题

嘿,我来帮你搞定这个正则问题!你之前的正则有两个核心问题:一是data-reactid="\d"里的\d只能匹配单个数字,但实际这个属性值是多位的;二是你没添加捕获目标数字的逻辑,就算匹配到前面的内容,也拿不到想要的结果。

正则表达式方案

先给你一个能直接适配需求的正则写法,针对你给出的字符串格式:

import re

# 示例输入文本
html_str = '</span></td><td class="Ta(c) Py(10px) Pstart(10px)" colspan="6" data-reactid="223"><strong data-reactid="96456">1.001</strong>'

# 匹配正则
pattern = r'</span></td><td class="Ta\(c\) Py\(10px\) Pstart\(10px\)" colspan="6" data-reactid="\d+"><strong data-reactid="\d+">(\d+\.\d+)</strong>'
target_numbers = re.findall(pattern, html_str)

print(target_numbers)  # 输出: ['1.001']

关键修正点:

  • data-reactid="\d"改成data-reactid="\d+"+表示匹配1个或多个数字,完美覆盖你说的0-100000之间的未知数字。
  • (\d+\.\d+)创建捕获组:这部分会精准匹配带小数点的数字,re.findall会直接返回捕获到的内容。如果需要支持整数(比如5这种),可以把捕获组改成(\d+\.?\d*)
  • 保留了对class属性里括号的转义(\(\)),因为括号在正则里是特殊字符,必须转义才能匹配字面量。

更鲁棒的版本(应对HTML空格/属性顺序变化)

HTML里经常会出现属性顺序调整、多余空格的情况,你可以用\s*(匹配任意数量的空格/换行)让正则更灵活:

pattern = r'</span></td>\s*<td\s+class="Ta\(c\) Py\(10px\) Pstart\(10px\)"\s+colspan="6"\s+data-reactid="\d+">\s*<strong\s+data-reactid="\d+">(\d+\.?\d*)</strong>'

更推荐的方案:用BeautifulSoup解析HTML

其实正则并不是处理HTML的最佳工具——如果页面结构稍有变化(比如新增一个属性、标签顺序调整),正则就会失效。更靠谱的方法是用专门的HTML解析库BeautifulSoup

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_str, 'html.parser')
# 定位到符合条件的td标签
target_td = soup.find('td', class_='Ta(c) Py(10px) Pstart(10px)', colspan="6")
if target_td:
    # 提取strong标签里的文本
    number = target_td.find('strong').get_text()
    print(number)  # 输出: 1.001

这种方法完全不用关心data-reactid这类动态属性,直接通过标签的class和colspan属性定位,稳定性高很多。

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

火山引擎 最新活动