You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

re.findall匹配结果异常:为何一个仅返回最后一项?如何让两者均返回所有匹配

解决Yelp HTML抓取中正则仅返回最后一个匹配项的问题

嘿,我来帮你搞定这个正则匹配的问题!你的第一个正则只返回最后一个结果,核心原因是贪婪匹配在搞鬼,咱们一步步来解决:

问题根源

你第一个正则里的[\w\W]*是贪婪模式的量词——它会尽可能多地匹配字符,从第一个data-hovercard-id="开始,直接吃到最后一个><span>...</span></a的位置,自然就只捕获到最后一组符合条件的内容。而第二个正则的[\W]*因为匹配的是非单词字符,刚好你的HTML里价格范围的结构不会让它过度匹配,所以能返回所有结果。

快速修复:切换到非贪婪模式

只需要给贪婪量词*加上?,把它改成非贪婪模式,让正则匹配到第一个满足结束条件的位置就停下来。修改后的第一个正则应该是:

re.findall('data-hovercard-id="[\w\W]*?"><span>([\w\W]*?)</span></a', data)

这里的[\w\W]*?会匹配到下一个><span>就停止,而不是一直吃到最后,这样就能捕获所有符合条件的span内容了。

更靠谱的长期方案:别用正则解析HTML

说实话,用正则处理HTML是个“治标不治本”的办法——HTML的结构太灵活了,比如多一个空格、标签属性顺序变了、嵌套结构调整,你的正则就可能直接失效。更稳妥的做法是用专门的HTML解析库,比如BeautifulSoup:

举个简单的例子,提取价格范围和hovercard对应的内容:

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'html.parser')

# 提取所有价格范围
price_ranges = [elem.get_text() for elem in soup.find_all('div', class_='business-attribute price-range')]

# 提取所有带data-hovercard-id的a标签下的span内容
hovercard_spans = [span.get_text() for span in soup.select('a[data-hovercard-id] span')]

这样不管HTML结构有小的变动,解析库都能正确识别元素,比正则稳定太多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:04:06