Cara memeriksa apakah string berisi elemen dari daftar dengan Python

217

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.

pootzko
sumber
4
Kemungkinan duplikat Periksa apakah banyak string ada di string lain
GingerPlusPlus

Jawaban:

418

Gunakan generator bersama dengan any, yang mengalami hubungan pendek pada True pertama:

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

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.

Lauritz V. Thaulow
sumber
1
ini persis apa yang saya cari. dalam kasus saya itu tidak masalah di mana dalam string adalah ekstensi. terima kasih
pootzko
Saran bagus. Dengan menggunakan contoh ini, ini adalah bagaimana saya memeriksa apakah ada argumen yang cocok dengan bendera bantuan yang terkenal: any ([x.lower () di ['-?', '- h', '- help', '/ h '] untuk x di sys.argv [1:]])
AX Labs
@ AX-Labs menggunakan daftar pemahaman di dalam anyakan 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.
Lauritz V. Thaulow
5
Dan jika saya ingin tahu apa ext ketika ada () mengembalikan Benar?
Peter Senna
@PeterSenna: 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)]
Dannid
45
extensionsToCheck = ('.pdf', '.doc', '.xls')

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

'test.jpg'.endswith(extensionsToCheck)   # returns False
eumiro
sumber
5
ini pintar - saya tidak tahu tuple bisa melakukan itu!, tetapi hanya berfungsi ketika substring Anda berlabuh ke salah satu ujung string.
Dannid
3
Sangat keren. Saya hanya berharap ada sesuatu seperti "mengandung" daripada hanya memulai atau mengakhiri
BrDaHa
@BrDaHa Anda dapat menggunakan 'in' untuk berisi. jika 'string' dalam daftar:
Shekhar Samanta
@ ShekharSamanta yakin, tapi itu tidak menyelesaikan masalah memeriksa apakah salah satu dari banyak hal ada dalam sebuah string, yang mana pertanyaan aslinya adalah tentang.
BrDaHa
Ya dalam kasus itu kita dapat menggunakan: jika ada (elemen dalam string.split ('any delmiter') untuk elemen dalam daftar) & untuk string jika ada (elemen dalam string untuk elemen dalam daftar)
Shekhar Samanta
21

Lebih baik mengurai URL dengan benar - dengan cara ini Anda dapat menangani http://.../file.doc?foodan http://.../foo.doc/file.exedengan benar.

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

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.

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

CATATAN: Ini hanya untuk memeriksa apakah itu berisi atau tidak dan tidak berguna ketika seseorang ingin mengekstrak kata yang cocok dengan ekstensi.

psun
sumber
Ini lebih mudah dibaca daripada anysolusi, itu salah satu solusi terbaik untuk pertanyaan itu menurut saya.
Dmitry Verhoturov
Yang ini lebih unggul daripada 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)
Dannid
2

Periksa apakah cocok dengan regex ini:

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

Catatan: jika ekstensi Anda tidak berada di akhir url, hapus $karakternya, tetapi sedikit melemahkannya


sumber
1
Ini URL, bagaimana jika memiliki string kueri?
Wladimir Palant
import re re.search (pattern, your_string)
juankysmith
sementara jawaban ini berfungsi untuk kasus yang ditentukan, itu tidak skalabel atau generik Anda membutuhkan regex panjang untuk setiap pola yang ingin Anda cocokkan.
Dannid
1

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)

extensionsToCheck = ['.pdf', '.doc', '.xls']
url_string = 'http://.../foo.doc'

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

['.doc'] `

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)

print [re.search(r'(\w+)'+extension, url_string).group(0) for extension in extensionsToCheck if(extension in url_string)]

['foo.doc']

Dannid
sumber