如何让第三方regex模块返回匹配计数及零匹配实例?
如何让正则匹配计数包含无匹配项的0值(兼容第三方regex模块)
需求:使用第三方
regex模块做重叠匹配时,希望输出的计数结果里,不光有实际匹配到的项,所有未匹配的目标组合也要显示0值。比如运行print(Counter(reg.findall('[ABCD][ABCD]', "AAABC", overlapped=True)))时,AD、BA、BB、BD、DA、DB、DC、DD这些没匹配到的项也得出现在结果里,值为0。
简便实现方法
核心思路是先明确所有需要统计的目标组合,再把正则匹配的统计结果和全量组合做合并,自动补全0值,完全兼容regex模块:
- 生成全量目标组合:先列出所有由A/B/C/D组成的双字符组合,这是我们要统计的完整范围。
- 统计匹配结果:用
regex.findall开启重叠匹配后,用Counter统计各组合的出现次数。 - 补全0值:以全量组合为基准,把统计结果对应填充,没匹配到的项直接设为0。
示例代码
import regex from collections import Counter # 生成所有A/B/C/D组成的双字符组合 all_possible_pairs = [f"{first}{second}" for first in 'ABCD' for second in 'ABCD'] # 待处理文本 target_text = "AAABC" # 执行重叠匹配并统计已匹配项的次数 matched_counts = Counter(regex.findall('[ABCD][ABCD]', target_text, overlapped=True)) # 合并全量组合与统计结果,补全0值 full_result = {pair: matched_counts.get(pair, 0) for pair in all_possible_pairs} # 按顺序输出结果 for pair, count in sorted(full_result.items()): print(f"{pair}: {count}")
额外技巧:保持Counter类型
如果需要结果还是Counter对象,可以先初始化一个全量0值的Counter,再更新匹配结果:
full_counter = Counter({pair: 0 for pair in all_possible_pairs}) full_counter.update(matched_counts) print(full_counter)
内容的提问来源于stack exchange,提问作者Ama Zon
相关产品推荐
相关产品推荐

