301 votes

Comment vérifier si une chaîne de caractères contient un élément d'une liste en Python ?

J'ai quelque chose comme ça :

extensionsToCheck = ['.pdf', '.doc', '.xls']

for extension in extensionsToCheck:
    if extension in url_string:
        print(url_string)

Je me demande quelle serait la manière la plus élégante de faire cela en Python (sans utiliser la boucle for) ? Je pensais à quelque chose comme ça (comme en C/C++), mais ça n'a pas marché :

if ('.pdf' or '.doc' or '.xls') in url_string:
    print(url_string)

Edit : Je suis un peu obligé d'expliquer en quoi cette question est différente de la question ci-dessous qui est marquée comme un duplicata potentiel (pour qu'elle ne soit pas fermée je suppose).

La différence est que je voulais vérifier si une chaîne de caractères fait partie d'une liste de chaînes de caractères alors que l'autre question consiste à vérifier si une chaîne de caractères d'une liste de chaînes de caractères est une sous-chaîne d'une autre chaîne de caractères. C'est similaire, mais pas tout à fait la même chose et la sémantique est importante lorsque vous cherchez une réponse en ligne. Ces deux questions cherchent en fait à résoudre le problème inverse l'un de l'autre. La solution pour les deux s'avère être la même cependant.

0 votes

Je ne suis pas sûr de ce que vous voulez dire par votre dernier paragraphe. Vous faire Je veux vérifier si une chaîne d'une liste de chaînes (les extensions de fichiers) est une sous-chaîne d'une autre chaîne (l'url).

544voto

Lauritz V. Thaulow Points 12146

Utilisez un générateur avec any qui court-circuite sur le premier True :

if any(ext in url_string for ext in extensionsToCheck):
    print(url_string)

EDITAR: Je vois que cette réponse a été acceptée par le PO. Bien que ma solution puisse être une solution "suffisante" à son problème particulier, et qu'elle soit un bon moyen général de vérifier si une chaîne de caractères dans une liste est trouvée dans une autre chaîne de caractères, gardez à l'esprit que c'est tout ce que cette solution fait. Il ne se soucie pas de l'endroit où se trouve la chaîne, par exemple à la fin de la chaîne. . Si cela est important, comme c'est souvent le cas avec les urls, vous devriez vous tourner vers la réponse de @Wladimir Palant, ou vous risquez d'obtenir des faux positifs.

3 votes

C'est exactement ce que je cherchais. dans mon cas, l'endroit où se trouve l'extension dans la chaîne n'a pas d'importance. merci.

1 votes

Excellente suggestion. En utilisant cet exemple, voici comment je vérifie si l'un des arguments correspond aux drapeaux d'aide bien connus : any([x.lower() in ['-?', '-h', '--help', '/h'] for x in sys.argv[1 :]])

0 votes

@AXE-Labs utilise les compréhensions de liste à l'intérieur any annulera certains des gains possibles que procure le court-circuitage, car il faudra construire la liste complète dans chaque cas. Si vous utilisez l'expression sans crochets ( any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:]) ), le x.lower() in [...] ne sera évaluée que jusqu'à ce qu'une valeur True soit trouvée.

57voto

eumiro Points 56644
extensionsToCheck = ('.pdf', '.doc', '.xls')

'test.doc'.endswith(extensionsToCheck)   # returns True

'test.jpg'.endswith(extensionsToCheck)   # returns False

7 votes

Je ne savais pas que les tuples pouvaient faire cela, mais cela ne fonctionne que lorsque votre sous-chaîne est ancrée à une extrémité de la chaîne.

4 votes

Super cool. J'aurais juste aimé qu'il y ait quelque chose comme "contient" plutôt que juste "commence avec" ou "finit avec".

0 votes

@BrDaHa vous pouvez utiliser 'in' pour contenir . if 'string' in list :

26voto

Wladimir Palant Points 34829

Il est préférable d'analyser l'URL correctement - de cette façon, vous pouvez gérer les éléments suivants http://.../file.doc?foo y http://.../foo.doc/file.exe correctement.

from urlparse import urlparse
import os
path = urlparse(url_string).path
ext = os.path.splitext(path)[1]
if ext in extensionsToCheck:
  print(url_string)

4voto

psun Points 335

Utilisez des compréhensions de listes si vous voulez une solution à une seule ligne. Le code suivant retourne une liste contenant la chaîne url_string quand elle a les extensions .doc, .pdf et .xls ou retourne une liste vide quand elle ne contient pas l'extension.

print [url_string for extension in extensionsToCheck if(extension in url_string)]

NOTE : Ceci est seulement pour vérifier si elle contient ou non et n'est pas utile quand on veut extraire le mot exact correspondant aux extensions.

2voto

Vérifiez s'il correspond à cette expression rationnelle :

'(\.pdf$|\.doc$|\.xls$)'

Remarque : si vos extensions ne sont pas à la fin de l'url, supprimez l'élément $ des personnages, mais ça l'affaiblit légèrement

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X