在python中查找字符串中出现字符串的第二次,第三次或更多次[重复]

Posted

技术标签:

【中文标题】在python中查找字符串中出现字符串的第二次,第三次或更多次[重复]【英文标题】:Finding the second, third, or further times that a string of characters occurs in a string in python [duplicate] 【发布时间】:2012-07-11 11:46:39 【问题描述】:

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

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

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

【问题讨论】:

好的,谢谢。我还没有学过正则表达式,所以我得写一些代码来绕过它。 【参考方案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'可选参数设置搜索的开始索引,每次使用最后一个找到的,加上子字符串的长度(所以我们每次都不会得到相同的结果)。 如果您想获得重叠匹配,请使用+ 1 而不是len(substring)

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

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

【讨论】:

这是我要写的解决方案,除了默认为简单地增加 current_pos,以处理重叠的匹配,正如你提到的。性能损失不大:-)【参考方案2】:

你可以使用递归:

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]
>>> 

【讨论】:

Python 默认的最大递归深度为 1000,因此如果有 1000 个或更多匹配,这将失败并返回 RuntimeError。此外,函数调用很昂贵,将其重写为while 循环很简单,从而提高了效率。【参考方案3】:

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

>>> s = "akjdsfaklafdjfjad"
>>> [n for n in set([s.find('a',x) for x in range(len(s))]) if n >= 0]
[0, 9, 6, 15]

【讨论】:

以上是关于在python中查找字符串中出现字符串的第二次,第三次或更多次[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Java中的字符串中查找第二次出现的子字符串

Google Big Query 中的第二个子字符串

我要获取一个字符串中某个标点第二次出现的位置

查找第二次出现索引最低的第一个重复元素

仅替换模式中的第二次出现

vb一个字符串在另一个字符串中第二次出现的位置?