Python 查找子序列(非连续)

Python 查找子序列(非连续),python,string,Python,String,如果我有字符串needle,我想检查它是否作为子字符串连续存在于haystack,我可以使用: if needle in haystack: ... 对于非连续子序列,我可以使用什么?例如: >>> haystack = "abcde12345" >>> needle1 = "ace13" >>> needle2 = "123abc" >>> is_subsequence(needle1, haystack) Tr

如果我有字符串
needle
,我想检查它是否作为子字符串连续存在于
haystack
,我可以使用:

if needle in haystack:
    ...
对于非连续子序列,我可以使用什么?例如:

>>> haystack = "abcde12345"
>>> needle1 = "ace13"
>>> needle2 = "123abc"
>>> is_subsequence(needle1, haystack)
True
>>> is_subsequence(needle2, haystack)  # order is important!
False

我不知道是否有内置函数,但手动操作相当简单

def存在(a、b):
“”“检查a中是否存在b作为子序列”“”
pos=0
对于ch in a:
如果pos

另一种可能性:您可以为针和干草堆创建迭代器,然后从干草堆迭代器中弹出元素,直到找到针中的所有字符,或者迭代器耗尽为止

def is_in(needle, haystack):
    try:
        iterator = iter(haystack)
        for char in needle:
            while next(iterator) != char:
                pass
        return True
    except StopIteration:
        return False

使用迭代器技巧:

it = iter(haystack)
all(x in it for x in needle)

这只是的简明版本。

我们可以尝试简单的for循环和break方法,并在找到匹配项后传递子字符串

def substr(lstr,sstr):
lenl = len(lstr)
for i in sstr:
    for j in range(lenl):
        if i not in lstr:
            return False
        elif i == lstr[j]:
            lstr = lstr[j+1:]
            break
        else:
            pass
return True   

我喜欢这具有线性时间复杂性,对于任何试图内联
it
的人来说,也就是说,尝试这样做一行:
all(iter(haystack)中的x代表针中的x)
,它不起作用,因为
iter(haystack)
每次都被重新实例化。
def substr(lstr,sstr):
lenl = len(lstr)
for i in sstr:
    for j in range(lenl):
        if i not in lstr:
            return False
        elif i == lstr[j]:
            lstr = lstr[j+1:]
            break
        else:
            pass
return True