Saya punya sesuatu seperti ini:
extensionsToCheck = ['.pdf', '.doc', '.xls']
for extension in extensionsToCheck:
if extension in url_string:
print(url_string)
Saya bertanya-tanya apa yang akan menjadi cara yang lebih elegan untuk melakukan ini dengan Python (tanpa menggunakan for loop)? Saya sedang memikirkan sesuatu seperti ini (seperti dari C / C ++), tetapi tidak berhasil:
if ('.pdf' or '.doc' or '.xls') in url_string:
print(url_string)
Sunting: Saya agak terpaksa menjelaskan bagaimana ini berbeda dengan pertanyaan di bawah ini yang ditandai sebagai duplikat potensial (jadi saya rasa tidak bisa ditutup).
Perbedaannya adalah, saya ingin memeriksa apakah sebuah string adalah bagian dari beberapa daftar string sedangkan pertanyaan lainnya adalah memeriksa apakah sebuah string dari daftar string adalah substring dari string lain. Mirip, tetapi tidak persis sama dan masalah semantik ketika Anda sedang mencari jawaban online IMHO. Kedua pertanyaan ini sebenarnya mencari untuk memecahkan masalah yang berlawanan satu sama lain. Solusi untuk keduanya ternyata sama.
sumber
Jawaban:
Gunakan generator bersama dengan
any
, yang mengalami hubungan pendek pada True pertama:EDIT: Saya melihat jawaban ini telah diterima oleh OP. Meskipun solusi saya mungkin solusi "cukup baik" untuk masalah khususnya, dan merupakan cara umum yang baik untuk memeriksa apakah ada string dalam daftar yang ditemukan di string lain, perlu diingat bahwa ini adalah semua yang dilakukan solusi ini. Tidak peduli DI MANA string ditemukan misalnya di akhir string . Jika ini penting, seperti yang sering terjadi pada url, Anda harus melihat jawaban @Wladimir Palant, atau Anda berisiko mendapatkan hasil positif palsu.
sumber
any
akan meniadakan beberapa kemungkinan keuntungan yang diberikan oleh hubungan pendek, karena seluruh daftar harus dibangun dalam setiap kasus. Jika Anda menggunakan ekspresi tanpa tanda kurung siku (any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])
),x.lower() in [...]
bagian hanya akan dievaluasi sampai nilai True ditemukan.any()
hanya akan mengembalikan benar atau salah , tetapi lihat jawaban pemahaman daftar @psun di bawah ini dengan modifikasi ini:print [extension for extension in extensionsToCheck if(extension in url_string)]
sumber
Lebih baik mengurai URL dengan benar - dengan cara ini Anda dapat menangani
http://.../file.doc?foo
danhttp://.../foo.doc/file.exe
dengan benar.sumber
Gunakan pemahaman daftar jika Anda menginginkan solusi satu baris. Kode berikut mengembalikan daftar yang berisi url_string ketika memiliki ekstensi .doc, .pdf, dan .xls atau mengembalikan daftar kosong ketika tidak berisi ekstensi.
CATATAN: Ini hanya untuk memeriksa apakah itu berisi atau tidak dan tidak berguna ketika seseorang ingin mengekstrak kata yang cocok dengan ekstensi.
sumber
any
solusi, itu salah satu solusi terbaik untuk pertanyaan itu menurut saya.any()
solusi menurut saya karena dapat diubah untuk mengembalikan nilai pencocokan khusus juga, seperti:print [extension for extension in extensionsToCheck if(extension in url_string)]
(lihat jawaban saya untuk detail tambahan dan cara mengekstrak kata yang cocok serta pola dari url_string)Periksa apakah cocok dengan regex ini:
Catatan: jika ekstensi Anda tidak berada di akhir url, hapus
$
karakternya, tetapi sedikit melemahkannyasumber
Ini adalah varian dari jawaban pemahaman daftar yang diberikan oleh @psun.
Dengan mengalihkan nilai output, Anda benar-benar dapat mengekstrak pola yang cocok dari pemahaman daftar (sesuatu yang tidak mungkin dilakukan dengan
any()
pendekatan oleh @ Lauritz-v-Thaulow)Selanjutnya Anda dapat menyisipkan ekspresi reguler jika Anda ingin mengumpulkan informasi tambahan setelah pola yang cocok diketahui (ini bisa berguna ketika daftar pola yang diizinkan terlalu lama untuk ditulis ke dalam pola regex tunggal)
sumber