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(..)).
filterversinya sangat jelas dan memiliki noise yang jauh lebih sedikit.
r.matchdisini?
r.matchadalah metode yang, ketika diterapkan ke string tertentu, menemukan apakah regex rcocok 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 filtermengembalikan 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?
strsejak filtermengembalikan daftar, tidak berhasil ...
print(list(newlist))atauprint([i for i in newlist])
Untuk melakukannya tanpa mengompilasi Regex terlebih dahulu, gunakan lambdafungsi - 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 callablesebagai argumen pertamanya, dan mengembalikan daftar di mana callable itu mengembalikan nilai 'kebenaran'.