python – 查找string中的string – 我可以得到所有的索引?

我有一些简单的代码:

def find(str, ch): for ltr in str: if ltr == ch: return str.index(ltr) find("ooottat", "o") 

该函数只返回第一个索引。 如果我改变返回打印,它会打印0 0 0.为什么这是有什么办法得到0 1 2

这是因为str.index(ch)将返回第一次出现ch的索引。 尝试:

 def find(s, ch): return [i for i, ltr in enumerate(s) if ltr == ch] 

这将返回你需要的所有索引列表。

PS Hugh的答案显示了一个生成器函数(如果索引列表可能会变大,它会有所不同)。 此function也可以通过将[]更改为()进行调整。

我会和Lev一起去,但是值得指出的是,如果最终得到更复杂的search,那么使用re.finditer可能是值得记住的(但是re经常会导致更多的麻烦而不是价值 – 但有时候也很方便知道)

 test = "ooottat" [ (i.start(), i.end()) for i in re.finditer('o', test)] # [(0, 1), (1, 2), (2, 3)] [ (i.start(), i.end()) for i in re.finditer('o+', test)] # [(0, 3)] 
 def find_offsets(haystack, needle): """ Find the start of all (possibly-overlapping) instances of needle in haystack """ offs = -1 while True: offs = haystack.find(needle, offs+1) if offs == -1: break else: yield offs for offs in find_offsets("ooottat", "o"): print offs 

结果是

 0 1 2 

列弗的答案是我会使用的,但是这是基于你的原始代码的东西:

 def find(str, ch): for i, ltr in enumerate(str): if ltr == ch: yield i >>> list(find("ooottat", "o")) [0, 1, 2] 

你可以试试这个

 def find(ch,string1): for i in range(len(string1)): if ch == string1[i]: pos.append(i) 

许多使用正则expression式的替代方法

导入重新

iter = re.finditer(r'o',searchString)

索引= [x.start()for x in iter]

索引是匹配的string索引列表