迭代字符串中子字符串的位置

时间:2015-01-31 00:03:27

标签: python string search iterator

我正在寻找如何迭代字符串中子字符串位置的最简单方法。目前我正在使用一个生成器,但我觉得它不是Python:

def iteratePos(haystack, needle) :
    pos = haystack.find(needle)
    while pos >= 0 :
        yield pos
        pos = haystack.find(needle, pos+1)

s = "ABC 11 ABC 111 ABC 1"
for i in iteratePos(s, "ABC") :
    print "aye bee see at", i
    # finds 0, 7, 15

for i in iteratePos(s, "1") :
    print "one at", i
    # finds 4, 5, 11, 12, 13, 19

那么,是否可以将其作为一个合理的单线程?或者我应该坚持我的解决方案吗?

(注意:当needle只是一个字符时,是否应该有一个简单的解决方案,我也对此感兴趣。)

2 个答案:

答案 0 :(得分:4)

s = "ABC 11 ABC 111 ABC 1"

print([ind for ind,_ in enumerate(s[:-2]) if s[ind:ind+3] == "ABC"])
[0, 7, 15]

在一个功能中:

def iteratePos(haystack, needle) :
    ln = len(needle)
    return [ind for ind,_ in enumerate(s[:-ln-1]) if haystack[ind:ind+ln] == needle]

或者在python3中使用yield from

def iteratePos(haystack, needle) :
    ln = len(needle)
    yield from (ind for ind, _ in enumerate(s[:-ln-1]) if haystack[ind:ind+ln] == needle)
print(next(iteratePos(s,"ABC")))
0

答案 1 :(得分:2)

我认为你的解决方案很好......但我想你可以做到

[i for i in range(len(s)) if s[i:].startswith(needle)]

如果你真的不喜欢你的解决方案