Mam coś takiego:
extensionsToCheck = ['.pdf', '.doc', '.xls']
for extension in extensionsToCheck:
if extension in url_string:
print(url_string)
Zastanawiam się, jaki byłby bardziej elegancki sposób na to w Pythonie (bez użycia pętli for)? Myślałem o czymś takim (jak z C / C ++), ale to nie działało:
if ('.pdf' or '.doc' or '.xls') in url_string:
print(url_string)
Edycja: Jestem trochę zmuszony do wyjaśnienia, w jaki sposób różni się to od pytania poniżej, które jest oznaczone jako potencjalny duplikat (więc chyba nie można go zamknąć).
Różnica polega na tym, że chciałem sprawdzić, czy ciąg znaków jest częścią jakiejś listy ciągów, podczas gdy drugim pytaniem jest sprawdzenie, czy ciąg znaków z listy ciągów jest podciągiem innego ciągu. Podobne, ale niezupełnie takie same i semantyka mają znaczenie, gdy szukasz odpowiedzi online IMHO. Te dwa pytania mają na celu rozwiązanie przeciwnego problemu. Rozwiązanie dla obu okazuje się jednak takie samo.
źródło
Odpowiedzi:
Użyj razem generatora
any
, który zwiera pierwsze True:EDYCJA: Widzę, że odpowiedź została zaakceptowana przez OP. Chociaż moje rozwiązanie może być „wystarczająco dobrym” rozwiązaniem jego konkretnego problemu i jest dobrym ogólnym sposobem sprawdzenia, czy jakieś ciągi na liście znajdują się w innym ciągu, pamiętaj, że to wszystko, co robi to rozwiązanie. Nie ma znaczenia GDZIE znaleziono łańcuch, np. Na końcu łańcucha . Jeśli jest to ważne, jak to często bywa z adresami URL, powinieneś spojrzeć na odpowiedź @Wladimir Palant, albo ryzykujesz uzyskanie fałszywych wyników pozytywnych.
źródło
any
zaprzecza niektórym możliwym korzyściom, jakie zapewnia zwarcie, ponieważ za każdym razem trzeba będzie zbudować całą listę. Jeśli użyjesz wyrażenia bez nawiasów kwadratowych (any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])
),x.lower() in [...]
część będzie oceniana tylko do momentu znalezienia wartości True.any()
zwróci tylko prawdę lub fałsz , ale patrz poniższa lista odpowiedziprint [extension for extension in extensionsToCheck if(extension in url_string)]
źródło
Lepiej jest poprawnie parsować adres URL - w ten sposób możesz obsługiwać
http://.../file.doc?foo
ihttp://.../foo.doc/file.exe
poprawnie.źródło
Użyj wyrażeń listowych, jeśli chcesz rozwiązania z pojedynczą linią. Poniższy kod zwraca listę zawierającą łańcuch url, gdy ma rozszerzenia .doc, .pdf i .xls lub zwraca pustą listę, gdy nie zawiera rozszerzenia.
UWAGA: Służy to tylko sprawdzeniu, czy zawiera lub nie, i nie jest użyteczne, gdy chce się wyodrębnić dokładne słowo pasujące do rozszerzeń.
źródło
any
rozwiązanie, moim zdaniem jedno z najlepszych możliwych rozwiązań tego pytania.any()
Moim zdaniem ten jest lepszy od rozwiązania, ponieważ można go zmienić tak, aby zwracał również określoną wartość dopasowania, na przykład:print [extension for extension in extensionsToCheck if(extension in url_string)]
(zobacz moją odpowiedź, aby uzyskać dodatkowe szczegóły i jak wyodrębnić pasujące słowo oraz wzorzec z url_string)Sprawdź, czy pasuje do tego wyrażenia regularnego:
Uwaga: jeśli rozszerzenia nie znajdują się na końcu adresu URL, usuń
$
znaki, ale nieco go osłabiźródło
Jest to wariant odpowiedzi na listę podanej przez @psun.
Przełączając wartość wyjściową, możesz faktycznie wyodrębnić pasujący wzorzec ze zrozumienia listy (coś nie jest możliwe przy
any()
podejściu @ Lauritz-v-Thaulow)Ponadto możesz wstawić wyrażenie regularne, jeśli chcesz zebrać dodatkowe informacje, gdy znany jest dopasowany wzorzec (może to być przydatne, gdy lista dozwolonych wzorców jest zbyt długa, aby zapisać w jednym wzorcu wyrażenia regularnego)
źródło