Saya ingin memfilter string dalam daftar berdasarkan ekspresi reguler.
Apakah ada yang lebih baik dari [x for x in list if r.match(x)]
?
Jawaban:
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 regex r
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 menjadi list
(untuk melihatnya dicetak dengan baik).
<filter object at 0x1057acda0>
Apa yang saya lakukan salah?
str
sejak filter
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 mengambil callable
sebagai argumen pertamanya, dan mengembalikan daftar di mana callable itu mengembalikan nilai 'kebenaran'.