使用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
相关产品推荐
相关产品推荐

