Python正则re.findall仅匹配最后结果,如何获取全部目标数字?
解决Python正则提取多个HTML课程编号的问题
原正则只返回最后一个结果的核心原因是:正则前后的.*?和.*会迫使引擎匹配整个字符串,最终只会定位到最后一个符合<a href='.*'>([0-9]+)</a>,的位置,因此仅捕获到最后一组数字。
要提取全部目标编号,只需聚焦每个<a>标签内的数字部分,调整正则即可:
方案1:直接提取标签包裹的数字
简化正则,精准匹配每个<a>标签中>与</a>之间的数字:
import re string = "<a href='https://academia/course/3743'>3743</a>, <a href='https://academia/course/3963'>3963</a>, <a href='https://academia/course/3850'>3850</a>," # 调整后的正则 pattern = r"<a href='.*?'>(\d+)</a>" result = re.findall(pattern, string) print(result) # 输出: ['3743', '3963', '3850']
如果需要整数类型的结果,直接用列表推导式转换:[int(num) for num in result]
方案2:关联href路径中的数字(确保一致性)
如果需要保证提取的数字与href路径里course/后的编号一致,可使用更精准的正则,同时捕获两者(按需取其中一组即可):
pattern = r"<a href='.*?course/(\d+)'>(\d+)</a>" result = re.findall(pattern, string) # 输出: [('3743', '3743'), ('3963', '3963'), ('3850', '3850')] # 取href中的编号:[pair[0] for pair in result]
关键注意点:
- 移除正则前后的
.*和,.*,避免匹配整个字符串 - 用
\d+替代[0-9]+,写法更简洁 - href内的
.*改为非贪婪匹配.*?,防止跨标签错误匹配
内容的提问来源于stack exchange,提问作者Sarthak Mahapatra
相关产品推荐
相关产品推荐

