您正在这样做(或语法变体):
import re
needle = "(?=(aba))"
haystack = "ababababa"
[match.start() for match in re.finditer(needle, haystack)]
#>>> [0, 2, 4, 6]
这应该工作。
因此,问题可能needle
不是正确的形式,“(?=(...))”(这从您与 D.Shawley 的互动中可以明显看出)。在这种情况下,有几种选择。
如果您的子字符串是有效的正则表达式,您可以手动遍历可能的位置,进行匹配。
needle = re.compile(needle)
[i for i in range(len(haystack)) if needle.match(haystack, i)]
#>>> [0, 2, 4, 6]
如果您不想要任意正则表达式而只是精确的子字符串匹配,那么完全避免正则表达式并使用:
needle = "aba"
haystack = "ababababa"
[i for i in range(len(haystack)) if haystack.startswith(needle, i)]
#>>> [0, 2, 4, 6]
如果您正在寻找更快的结果,您可以展开循环并使用它.index
来加快搜索速度:
def findall(needle, haystack):
i = 0
try:
while True:
i = haystack.index(needle, i)
yield i
i += 1
except ValueError:
pass
这是我能想到的最快的方法。