查找python中字符串中出现字符串的第二个,第三个或更多次

时间:2012-07-11 19:13:14

标签: python string python-2.7 substring

  

可能重复:
  Find all occurrences of a substring in Python

我有一串数字,我试图找到每次字符串中出现一定数量的数字。

我知道我是否使用,例如:numString.find(str)它会在第一次出现时告诉我。无论如何都要修改这个语句以找到每次str发生的时间,而不仅仅是第一个?

3 个答案:

答案 0 :(得分:1)

你可以使用递归:

find()使用第二个可选参数,它为搜索提供starting index,因此每次迭代都可以将该参数设置为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]
>>> 

答案 1 :(得分:1)

好吧,regexp是不可能的,请考虑这个生成器代码:

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

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

只是旁注:生成器(也就是yield关键字)比普通列表更有内存效率,而while循环的开销远远小于递归(如果你是一个人,它也更容易阅读是)。

答案 2 :(得分: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]