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 façon 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 cela n'a pas fonctionné:
if ('.pdf' or '.doc' or '.xls') in url_string:
print(url_string)
Edit: je suis un peu obligé d'expliquer en quoi cela est différent de la question ci-dessous qui est marquée comme doublon potentiel (donc elle ne se ferme pas, je suppose).
La différence est que je voulais vérifier si une chaîne fait partie d'une liste de chaînes alors que l'autre question consiste à vérifier si une chaîne d'une liste de chaînes est une sous-chaîne d'une autre chaîne. Similaire, mais pas tout à fait la même chose et la sémantique importe lorsque vous recherchez une réponse en ligne à mon humble avis. Ces deux questions cherchent en fait à résoudre le problème opposé l'une de l'autre. La solution pour les deux s'avère cependant la même.
la source
Réponses:
Utilisez un générateur avec
any
lequel court-circuite sur le premier True:EDIT: Je vois que cette réponse a été acceptée par OP. Bien que ma solution puisse être une solution "assez bonne" à son problème particulier et constitue un bon moyen général de vérifier si des chaînes d'une liste se trouvent dans une autre chaîne, gardez à l'esprit que c'est tout ce que fait cette solution. Peu importe 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 URL, vous devriez chercher la réponse de @Wladimir Palant, sinon vous risquez d'obtenir des faux positifs.
la source
any
annulera certains des gains possibles que fournit le court-circuit, car la liste entière devra être construite dans tous les cas. Si vous utilisez l'expression sans crochets (any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])
), lax.lower() in [...]
pièce sera évaluée uniquement jusqu'à ce qu'une valeur True soit trouvée.any()
ne renverra que vrai ou faux , mais voir la réponse de compréhension de liste de @psun ci-dessous avec cette modification:print [extension for extension in extensionsToCheck if(extension in url_string)]
la source
Il est préférable d'analyser correctement l'URL - de cette façon, vous pouvez gérer
http://.../file.doc?foo
ethttp://.../foo.doc/file.exe
correctement.la source
Utilisez des listes de compréhension si vous voulez une solution sur une seule ligne. Le code suivant retourne une liste contenant la chaîne url lorsqu'elle a les extensions .doc, .pdf et .xls ou renvoie une liste vide lorsqu'elle ne contient pas l'extension.
NOTE: Ceci est uniquement pour vérifier s'il contient ou non et n'est pas utile lorsque l'on veut extraire le mot exact correspondant aux extensions.
la source
any
solution, c'est l'une des meilleures solutions possibles pour cette question à mon avis.any()
solution à mon avis, car il peut également être modifié pour renvoyer la valeur de correspondance spécifique, comme ceci:print [extension for extension in extensionsToCheck if(extension in url_string)]
(voir ma réponse pour plus de détails et comment extraire le mot correspondant ainsi que le modèle de la chaîne url)Vérifiez s'il correspond à cette expression régulière:
Remarque: si vos extensions ne sont pas à la fin de l'url, supprimez les
$
caractères, mais cela l'affaiblit légèrementla source
Ceci est une variante de la réponse de compréhension de liste donnée par @psun.
En changeant la valeur de sortie, vous pouvez réellement extraire le modèle de correspondance de la compréhension de la liste (chose impossible avec l'
any()
approche de @ Lauritz-v-Thaulow)Vous pouvez en outre insérer une expression régulière si vous souhaitez collecter des informations supplémentaires une fois que le motif correspondant est connu (cela pourrait être utile lorsque la liste des motifs autorisés est trop longue pour être écrite dans un seul motif d'expression régulière)
la source