Encontrar subsecuencia (no consecutiva)

Si tengo needle hilo y quiero comprobar si existe de forma contigua como subcadena en el haystack , puedo usar:

 if needle in haystack: ... 

¿Qué puedo usar en el caso de una subsecuencia no continua? Ejemplo:

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

No sé si hay una función incorporada, pero es bastante simple de hacer manualmente

 def exists(a, b): """checks if b exists in a as a subsequence""" pos = 0 for ch in a: if pos < len(b) and ch == b[pos]: pos += 1 return pos == len(b) 
 >>> exists("moo", "mo") True >>> exists("moo", "oo") True >>> exists("moo", "ooo") False >>> exists("haystack", "hack") True >>> exists("haystack", "hach") False >>> 

Usando un truco iterador:

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

Esta es solo una versión concisa de la misma idea presentada en otra respuesta .

Otra posibilidad: puede crear iteradores para ambos, aguja y pajar, y luego hacer estallar elementos desde el pajar-iterador hasta que se encuentren todos los caracteres de la aguja, o se agote el iterador.

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