Como posso verificar se alguma das strings de uma matriz existe em outra string?
Gostar:
a = ['a', 'b', 'c']
str = "a123"
if a in str:
print "some of the strings found in str"
else:
print "no strings found in str"
Esse código não funciona, é apenas para mostrar o que eu quero alcançar.
[abc]
também funciona perfeitamente bem e será mais rápido se houver mais de dois candidatos para testar. Mas se as seqüências de caracteres são arbitrárias e você não as conhece antecipadamente para construir uma regex, terá que usar aany(x in str for x in a)
abordagem.Respostas:
Você pode usar
any
:Da mesma forma, para verificar se todas as strings da lista foram encontradas, use em
all
vez deany
.fonte
for x in a
como "para cada elemento da lista". Desdea
é uma lista de strings, ex
é um elemento dessa lista,x
é uma string (um dos 'a', 'b', 'c' no exemplo original)any()
é, de longe, a melhor abordagem, se tudo o que você quer éTrue
ouFalse
, mas se você deseja saber especificamente quais strings / strings correspondem, você pode usar algumas coisas.Se você deseja a primeira correspondência (com o
False
padrão):Se você deseja obter todas as correspondências (incluindo duplicatas):
Se você deseja obter todas as correspondências não duplicadas (independentemente da ordem):
Se você deseja obter todas as correspondências não duplicadas na ordem correta:
fonte
OrderedDict
provavelmente é mais eficiente que uma lista. Veja esta resposta em "Removendo duplicatas em listas"Você deve ter cuidado se as cordas entrarem
a
ou ficaremstr
mais longas. As soluções simples levam O (S * (A ^ 2)), ondeS
é o comprimento destr
e A é a soma dos comprimentos de todas as seqüências de caracteres ema
. Para uma solução mais rápida, observe o algoritmo Aho-Corasick para correspondência de cadeias, que é executado no tempo linear O (S + A).fonte
Apenas para adicionar um pouco de diversidade com
regex
:ou se sua lista for muito longa -
any(re.findall(r'|'.join(a), str, re.IGNORECASE))
fonte
(
ou*
isso falhar, é necessário fazer a citação para a sintaxe regex.'|'.join(map(re.escape, strings_to_match))
. Você provavelmente deveriare.compile('|'.join(...))
também.Você precisa iterar nos elementos de a.
fonte
jbernadas já mencionou o algoritmo Aho-Corasick para reduzir a complexidade.
Aqui está uma maneira de usá-lo em Python:
Faça o download do aho_corasick.py aqui
Coloque-o no mesmo diretório do seu arquivo Python principal e nomeie-o
aho_corasick.py
Tente o alrorithm com o seguinte código:
Observe que a pesquisa diferencia maiúsculas de minúsculas
fonte
fonte
Depende do contexto suponho que se você quiser verificar literal única como (qualquer única palavra a, e, w, .. etc) em é suficiente
se você quiser verificar algum dos caracteres entre a palavra_ original: faça uso de
se você quiser toda a entrada que desejar nessa palavra_ original, use todas as
fonte
Apenas mais algumas informações sobre como obter todos os elementos da lista disponíveis em String
fonte
Uma abordagem surpreendentemente rápida é usar
set
:Isso funciona se
a
não contiver nenhum valor de vários caracteres (nesse caso, useany
como listado acima ). Se assim for, é mais simples para especificara
como uma string:a = 'abc'
.fonte
fonte
Eu usaria esse tipo de função para velocidade:
fonte
fonte