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

Python中统计字符串子串出现次数的问题求助

解决Python中重叠子串的统计问题

首先看你当前代码的问题:

  • 你的count_substring函数根本没做子串统计逻辑,只是循环打印了原字符串,而且没有返回值,所以调用后count变量是None,最后打印时就会输出原字符串加None,也就是你看到的ABCDCDCNone。
  • 直接用字符串的count方法只得到1次,是因为str.count()默认不统计重叠的子串。比如ABCDCDC里,第一个CDC在索引2-4,count会从索引5开始继续查找,后面没有完整的CDC了,所以只算1次,但实际重叠的索引4-6也是CDC,所以正确结果是2。

正确实现方法1:手动遍历匹配

def count_substring(string, sub_string):
    str_len = len(string)
    sub_len = len(sub_string)
    count = 0
    # 遍历所有可能的起始位置,i最大到str_len - sub_len,否则取子串会越界
    for i in range(str_len - sub_len + 1):
        if string[i:i+sub_len] == sub_string:
            count += 1
    return count

if __name__ == '__main__':
    string = input().strip()
    sub_string = input().strip()
    
    count = count_substring(string, sub_string)
    print(count)

这段代码会逐个检查每个可能的起始位置,只要子串匹配就计数,包括重叠的情况,输入ABCDCDC和CDC会返回2,符合预期。

正确实现方法2:用正则表达式匹配重叠子串

如果想用更简洁的方式,可以用正则的正向预查来匹配所有重叠的子串位置:

import re

def count_substring(string, sub_string):
    # 正向预查(?=...)不会消耗字符串,所以能匹配重叠的情况
    matches = re.findall(f'(?={sub_string})', string)
    return len(matches)

if __name__ == '__main__':
    string = input().strip()
    sub_string = input().strip()
    
    count = count_substring(string, sub_string)
    print(count)

这个方法利用正则的特性,找到所有能匹配子串的起始位置,最后返回匹配结果的长度,同样能得到正确的2次。

内容的提问来源于stack exchange,提问作者Daniel Lahmanchuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:55:28