1

可能重复:
在 Python 中查找所有出现的子字符串

我有一串数字,并且每次在字符串中出现特定的数字串时都试图找到它。

我知道如果我使用,例如:numString.find(str)它会在它第一次发生时告诉我。无论如何修改此语句以查找 str 发生的每次,而不仅仅是第一次?

4

3 回答 3

1

你可以使用递归:

find()使用第二个可选参数,它提供starting indexfor 搜索,因此在每次迭代时,您都可以将该参数设置为返回的当前值find()+1

>>> strs='aabbaabbaabbaabbaa'
>>> def ret(x,a,lis=None,start=0):
    if lis is None:
        lis=[]
    if x.find(a,start)!=-1:
         index=x.find(a,start)
        lis.append(index)
        return ret(x,a,lis=lis,start=index+1)
    else: return lis

>>> ret(strs,'aa')
[0, 4, 8, 12, 16]

>>> ret(strs,'bb')
[2, 6, 10, 14]
>>> 
于 2012-07-11T19:21:06.077 回答
1

那么,正则表达式是不可能的,考虑这个生成器代码:

def find_all(target, substring):
    current_pos = target.find(substring)
    while current_pos != -1:
        yield current_pos
        current_pos += len(substring)
        current_pos = target.find(substring, current_pos)

我们使用 'find' 可选参数设置搜索的起始索引,每次使用最后一个找到的,加上子字符串的长度(所以我们每次都不会得到相同的结果)。如果您想获得重叠匹配,请使用+ 1and not len(substring)

'list(find_all('abbccbb', 'bb'))'可以获得实际的索引列表。

顺便说一句:生成器(又名yield关键字)比普通列表更节省内存,而 while 循环的开销远低于递归(如果您是人类,也更容易阅读)。

于 2012-07-11T20:38:07.317 回答
0

不是最有效的方法..但它是单线!如果这很重要.... :)

>>> s = "akjdsfaklafdjfjad"
>>> [n for n in set([s.find('a',x) for x in range(len(s))]) if n >= 0]
[0, 9, 6, 15]
于 2012-07-11T19:28:49.553 回答