Essa é uma pergunta bastante antiga, mas ofereço esta resposta porque as respostas anteriores não lidam com itens da lista que não são cadeias de caracteres (ou algum tipo de objeto iterável). Esses itens causariam uma falha na compreensão da lista inteira, com uma exceção.
Para lidar com esses itens normalmente na lista, ignorando os itens não iteráveis, use o seguinte:
[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]
então, com essa lista:
lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'
você ainda receberá os itens correspondentes ( ['abc-123', 'abc-456']
)
O teste para iterável pode não ser o melhor. Entendi a partir daqui: No Python, como determino se um objeto é iterável?