如何查找所有出现的子字符串?

如何查找所有出现的子字符串?

Pythonstring.find()string.rfind()若要获取字符串中的子字符串的索引,请执行以下操作。

我想知道是否有string.find_all()它可以返回所有找到的索引(不仅从开始返回第一个索引,或者从末尾返回第一个索引)。

例如:

string = "test test test test"print string.find('test') # 0print string.rfind('test') # 15#this is the goalprint string.find_all('test') 
# [0,5,10,15]


喵喔喔
浏览 850回答 5
5回答

汪汪一只猫

没有简单的内置字符串函数来完成您想要的功能,但是您可以使用更强大的正则表达式:import re[m.start() for m in re.finditer('test', 'test test test test')]#[0, 5, 10, 15]如果你想找到重叠的匹配,前瞻会这样做:[m.start() for m in re.finditer('(?=tt)', 'ttt')]#[0, 1]如果您想要一个没有重叠的反向查找-所有,您可以将正向和负面的前瞻性组合成这样的表达式:search = 'tt'[m.start() for m in re.finditer('(?=%s)(?!.{1,%d}%s)' % (search, len(search)-1, search), 'ttt')]#[1]re.finditer返回发电机,这样您就可以更改[]在上面()获得一个生成器,而不是一个列表,如果您只迭代结果一次,那么这个列表就会更高效。

米琪卡哇伊

>>> help(str.find)Help on method_descriptor:find(...)     S.find(sub [,start [,end]]) -> int因此,我们可以自己建立: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 matcheslist(find_all('spam spam spam spam', 'spam')) # [0, 5, 10, 15]不需要临时字符串或正则表达式。
打开App,查看更多内容
随时随地看视频慕课网APP