views:

63

answers:

2

What's the best way to count the number of occurrences of a given string, including overlap in python? is it the most obvious way:

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')
returns 5

?

or is there a better way in python?

+4  A: 

Well, this might be faster since it does the comparing in C:

def occurances(string, sub):
    count, start = 0,0
    while True:
        start = string.find(sub, start) + 1
        if start > 0:
            count+=1
        else:
            return count
THC4k
Definitely +1. Although I'd prefer `count= start= 0`. No real reason for tuple unpacking here.
ΤΖΩΤΖΙΟΥ
@ΤΖΩΤΖΙΟΥ: Damn, I didn't know you could do that. More precisely, I must have forgotten, since I'm sure I went through the whole tutorial when I was first learning (and yes, I've confirmed it's in the tutorial). But I never see anyone use chained assignment; whereas I see tuple assignment all the time. Go fig.
John Y
A: 
def count_overlaps (string, look_for):
    start   = 0
    matches = 0

    while True:
        start = string.find (look_for, start)
        if start < 0:
            break

        start   += 1
        matches += 1

    return matches

print count_overlaps ('abrabra', 'abra')
doublep