python – How to find all occurrences of a substring?

python – How to find all occurrences of a substring?

There is no simple built-in string function that does what youre looking for, but you could use the more powerful regular expressions:

import re
[m.start() for m in re.finditer(test, test test test test)]
#[0, 5, 10, 15]

If you want to find overlapping matches, lookahead will do that:

[m.start() for m in re.finditer((?=tt), ttt)]
#[0, 1]

If you want a reverse find-all without overlaps, you can combine positive and negative lookahead into an expression like this:

search = tt
[m.start() for m in re.finditer((?=%s)(?!.{1,%d}%s) % (search, len(search)-1, search), ttt)]
#[1]

re.finditer returns a generator, so you could change the [] in the above to () to get a generator instead of a list which will be more efficient if youre only iterating through the results once.

>>> help(str.find)
Help on method_descriptor:

find(...)
    S.find(sub [,start [,end]]) -> int

Thus, we can build it ourselves:

def find_all(a_str, sub):
    start = 0
    while True:
        start = a_str.find(sub, start)
        if start == -1: return
        yield start
        start += len(sub) # use start += 1 to find overlapping matches

list(find_all(spam spam spam spam, spam)) # [0, 5, 10, 15]

No temporary strings or regexes required.

python – How to find all occurrences of a substring?

Heres a (very inefficient) way to get all (i.e. even overlapping) matches:

>>> string = test test test test
>>> [i for i in range(len(string)) if string.startswith(test, i)]
[0, 5, 10, 15]

Leave a Reply

Your email address will not be published. Required fields are marked *