Python如何统计一个字符串在另一个字符串中的重叠出现次数
Python统计重叠子串出现次数的实现方法
问题原因
Python内置的str.count()方法仅统计非重叠的子串出现次数:匹配到子串后,会直接从匹配段的结束位置的下一位开始后续查找,因此在你的示例中只能得到2次的结果。
实现方案
方案1:手动遍历查找(无第三方依赖,性能稳定)
def count_overlap(main_str: str, sub_str: str) -> int: count = 0 start = 0 sub_length = len(sub_str) main_length = len(main_str) # 剩余长度不足时直接终止循环 while start <= main_length - sub_length: current_pos = main_str.find(sub_str, start) if current_pos == -1: break count += 1 # 从匹配位置的下一位开始下一轮查找,支持重叠匹配 start = current_pos + 1 return count # 测试你的示例 a = "1ab1" new_string = "1ab1ab1ab1" print(count_overlap(new_string, a)) # 输出结果:3
方案2:正则表达式正向预查(代码更简洁)
利用正则正向预查不消耗匹配字符的特性,实现重叠匹配统计,注意要使用re.escape()处理子串,避免子串包含正则特殊字符导致匹配异常:
import re a = "1ab1" new_string = "1ab1ab1ab1" count = len(re.findall(f'(?={re.escape(a)})', new_string)) print(count) # 输出结果:3
注意事项
- 如果待匹配子串长度为0,或者长度大于主字符串,可直接返回0,上述两种方案默认都会兼容该场景。
- 若子串包含正则特殊字符(比如
.、*、+等),方案2必须搭配re.escape()使用,否则会出现匹配错误。
内容的提问来源于stack exchange,提问作者Funnycallsw
相关产品推荐
相关产品推荐

