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索引列表