Eu tenho algo parecido com isto:
extensionsToCheck = ['.pdf', '.doc', '.xls']
for extension in extensionsToCheck:
if extension in url_string:
print(url_string)
Eu estou querendo saber qual seria a maneira mais elegante de fazer isso no Python (sem usar o loop for)? Eu estava pensando em algo assim (como em C / C ++), mas não funcionou:
if ('.pdf' or '.doc' or '.xls') in url_string:
print(url_string)
Edit: Eu sou meio que forçado a explicar como isso é diferente da pergunta abaixo, que está marcada como potencial duplicada (para que não fique fechada, eu acho).
A diferença é que eu queria verificar se uma string faz parte de alguma lista de strings, enquanto a outra pergunta é verificar se uma string de uma lista de strings é uma substring de outra string. Semelhante, mas não exatamente o mesmo, e a semântica importa quando você procura uma resposta on-line IMHO. Essas duas perguntas estão realmente procurando resolver o problema oposto um do outro. A solução para ambos acaba sendo a mesma.
fonte
Respostas:
Use um gerador junto com o
any
qual curto-circuito no primeiro True:EDIT: Vejo que esta resposta foi aceita pelo OP. Embora minha solução possa ser "boa o suficiente" para o seu problema específico e seja uma boa maneira geral de verificar se alguma string de uma lista foi encontrada em outra string, lembre-se de que isso é tudo o que essa solução faz. Não importa ONDE a cadeia é encontrada, por exemplo, no final da cadeia . Se isso é importante, como geralmente acontece com os URLs, você deve procurar a resposta de @Wladimir Palant, ou corre o risco de obter falsos positivos.
fonte
any
, negará alguns dos possíveis ganhos que o curto-circuito fornece, porque a lista inteira terá que ser construída em todos os casos. Se você usar a expressão sem colchetes (any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])
), ax.lower() in [...]
peça será avaliada apenas até que um valor True seja encontrado.any()
retornará apenas verdadeiro ou falso , mas veja a resposta de compreensão da lista do @psun abaixo com esta modificação:print [extension for extension in extensionsToCheck if(extension in url_string)]
fonte
É melhor analisar o URL corretamente - dessa forma, você pode lidar com isso
http://.../file.doc?foo
ehttp://.../foo.doc/file.exe
corretamente.fonte
Use a compreensão da lista se desejar uma solução de linha única. O código a seguir retorna uma lista que contém a url_string quando possui as extensões .doc, .pdf e .xls ou retorna uma lista vazia quando não contém a extensão.
NOTA: Isso serve apenas para verificar se ele contém ou não e não é útil quando se deseja extrair a palavra exata que corresponde às extensões.
fonte
any
solução, na minha opinião, é uma das melhores soluções possíveis para essa pergunta.any()
solução, na minha opinião, porque pode ser alterado para retornar também o valor de correspondência específico, da seguinte forma:print [extension for extension in extensionsToCheck if(extension in url_string)]
(veja minha resposta para obter detalhes adicionais e como extrair a palavra correspondente e o padrão da url_string)Verifique se ele corresponde a este regex:
Nota: se as extensões não estiverem no final do URL, remova os
$
caracteres, mas o enfraquece um poucofonte
Esta é uma variante da resposta de compreensão da lista dada por @psun.
Ao alternar o valor de saída, é possível extrair o padrão de correspondência da compreensão da lista (algo que não é possível com a
any()
abordagem de @ Lauritz-v-Thaulow)Além disso, você pode inserir uma expressão regular se desejar coletar informações adicionais assim que o padrão correspondente for conhecido (isso pode ser útil quando a lista de padrões permitidos for muito longa para gravar em um único padrão regex)
fonte