使用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




