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
相关产品推荐
相关产品推荐

