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

使用re.findall时如何去除正则中始终为空的多余捕获组

解决方案

有两种实现方式,你可以根据需求选择:

方案1:修改正则模式,删除多余捕获组

你当前的正则里中间的(:(?:\w+\s)+)?是捕获组,所以re.findall会把它的匹配结果也返回。只需要把这个不需要的捕获组改成非捕获组(左括号后加?:),让最终正则仅保留你需要的两个捕获组即可:

# 修改后的正则,仅保留2个需要的捕获组,前面加r为原生字符串避免转义异常
regex = r'((?::(?:\w+\s)+)?\w+)\[([+-]\d)\]'

matches = []
for line in sentences:
    result = re.findall(regex, str(line))
    matches.append(result)

修改后直接输出的就是你要的[[('very good', '+3'), ('good', '+2')]]格式。

方案2:不修改正则,处理匹配结果过滤掉不需要的字段

如果不想改动原有正则,也可以在拿到匹配结果后,只取每个三元组的第1个和第3个值(对应索引0和2):

regex = r'((:(?:\w+\s)+)?\w+)\[((?:\+|\-)\d)\]'

matches = []
for line in sentences:
    result = re.findall(regex, str(line))
    # 过滤掉中间不需要的空字段
    filtered_result = [(item[0], item[2]) for item in result]
    matches.append(filtered_result)

优先推荐方案1,正则本身更简洁,后续维护也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:57:04