如何用Python统计字符串中'BB'或'EE'的重叠出现频率
简化重叠子串统计代码的几种方法
你的核心需求是统计字符串中重叠出现的'BB'和'EE'次数,Python内置的str.count()因为只统计非重叠匹配,所以没法满足。下面给你几种比原循环更简洁的实现方式:
方法1:生成器表达式(无需额外库)
直接遍历所有可能的起始位置,用生成器表达式统计符合条件的子串数量,代码更紧凑:
s = input().strip() count_bb = sum(1 for i in range(len(s) - 1) if s[i:i+2] == 'BB') count_ee = sum(1 for i in range(len(s) - 1) if s[i:i+2] == 'EE') print(f"BB出现次数:{count_bb},EE出现次数:{count_ee}")
- 原理:
range(len(s)-1)确保不会越界,每次取s[i:i+2]检查是否为目标子串,符合条件就加1,sum()直接汇总总数。
方法2:正则表达式(更简洁)
利用正则的正向预查特性,可以一次性匹配所有重叠的目标子串,再通过结果长度得到次数:
import re s = input().strip() count_bb = len(re.findall(r'(?=BB)', s)) count_ee = len(re.findall(r'(?=EE)', s)) print(f"BB出现次数:{count_bb},EE出现次数:{count_ee}")
- 原理:
(?=BB)是正向预查,它会匹配所有后面跟着'BB'的位置,不会消耗字符,因此能捕捉到重叠的情况(比如'BBB'里会匹配前两个B的起始位置和后两个B的起始位置,共2次)。
对比原代码的优化点
原循环里有冗余的判断(i>1),且变量a、b未初始化,上面的方法不仅更简洁,还避免了这些问题,可读性也更强。
内容的提问来源于stack exchange,提问作者Edward Jin
相关产品推荐
相关产品推荐

