为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

喵喔喔 2019-06-12 15:07:50
如何查找所有出现的子字符串?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]
查看完整描述

5 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

没有简单的内置字符串函数来完成您想要的功能,但是您可以使用更强大的正则表达式:

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返回发电机,这样您就可以更改[]在上面()获得一个生成器,而不是一个列表,如果您只迭代结果一次,那么这个列表就会更高效。


查看完整回答
反对 回复 2019-06-12
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

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

不需要临时字符串或正则表达式。


查看完整回答
反对 回复 2019-06-12
  • 5 回答
  • 0 关注
  • 780 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信