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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:15:03