Saya ingin memfilter string dalam daftar berdasarkan ekspresi reguler.
Apakah ada yang lebih baik dari [x for x in list if r.match(x)]
?
Anda dapat membuat iterator dengan Python 3.x atau daftar dengan Python 2.x dengan menggunakan:
filter(r.match, list)
Untuk mengubah iterator Python 3.x menjadi sebuah daftar, cukup lakukan; list(filter(..))
.
filter
versinya sangat jelas dan memiliki noise yang jauh lebih sedikit.r.match
disini?r.match
adalah metode yang, ketika diterapkan ke string tertentu, menemukan apakah regexr
cocok dengan string itu (dan mengembalikan objek pencocokan jika demikian, tetapi itu tidak masalah dalam kasus ini karena kami hanya peduli apakah hasilnya benar)Contoh Lengkap (Python 3):
Untuk Python 2.x lihat Catatan di bawah ini
import re mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"] r = re.compile(".*cat") newlist = list(filter(r.match, mylist)) # Read Note print(newlist)
Cetakan:
['cat', 'wildcat', 'thundercat']
catatan:
Untuk pengembang Python 2.x, sudah
filter
mengembalikan daftar. Dalam Python 3.xfilter
diubah untuk mengembalikan iterator sehingga harus diubah menjadilist
(untuk melihatnya dicetak dengan baik).Contoh kode Python 3 Contoh kode
Python 2.x.
sumber
<filter object at 0x1057acda0>
Apa yang saya lakukan salah?str
sejakfilter
mengembalikan daftar, tidak berhasil ...print(list(newlist))
atauprint([i for i in newlist])
Untuk melakukannya tanpa mengompilasi Regex terlebih dahulu, gunakan
lambda
fungsi - misalnya:from re import match values = ['123', '234', 'foobar'] filtered_values = list(filter(lambda v: match('^\d+$', v), values)) print(filtered_values)
Pengembalian:
['123', '234']
filter()
hanya mengambilcallable
sebagai argumen pertamanya, dan mengembalikan daftar di mana callable itu mengembalikan nilai 'kebenaran'.sumber