字符串计数与重叠出现

71 投票
25 回答
88099 浏览
提问于 2025-04-15 23:32

在Python中,怎么才能数出一个字符串出现了多少次,包括重叠的部分呢?这里有一种方法:

def function(string, str_to_search_for):
      count = 0
      for x in xrange(len(string) - len(str_to_search_for) + 1):
           if string[x:x+len(str_to_search_for)] == str_to_search_for:
                count += 1
      return count


function('1011101111','11')

这个方法会返回5。

在Python中有没有更好的方法呢?

25 个回答

23

你也可以试试这个新的 Python 正则表达式模块,它支持重叠匹配。

import regex as re

def count_overlapping(text, search_for):
    return len(re.findall(search_for, text, overlapped=True))

count_overlapping('1011101111','11')  # 5
57
>>> import re
>>> text = '1011101111'
>>> len(re.findall('(?=11)', text))
5

如果你不想把所有的匹配结果一次性加载到内存中,这其实并不是个问题!如果你真的想这么做,可以这样:

>>> sum(1 for _ in re.finditer('(?=11)', text))
5

作为一个函数(re.escape可以确保子字符串不会干扰正则表达式):

def occurrences(text, sub):
    return len(re.findall('(?={0})'.format(re.escape(sub)), text))
>>> occurrences(text, '11')
5
95

好吧,这个可能会更快,因为它是在C语言中进行比较的:

def occurrences(string, sub):
    count = start = 0
    while True:
        start = string.find(sub, start) + 1
        if start > 0:
            count+=1
        else:
            return count

撰写回答