Tôi muốn lọc các chuỗi trong danh sách dựa trên một biểu thức chính quy.
Có cái gì tốt hơn [x for x in list if r.match(x)]
không?
Câu trả lời:
Bạn có thể tạo một trình lặp trong Python 3.x hoặc một danh sách trong Python 2.x bằng cách sử dụng:
filter(r.match, list)
Để chuyển đổi trình lặp Python 3.x thành một danh sách, chỉ cần ép kiểu nó; list(filter(..))
.
filter
phiên bản hoàn toàn rõ ràng và ít nhiễu hơn nhiều.
r.match
ở đây?
r.match
là một phương thức, khi được áp dụng cho một chuỗi nhất định, sẽ tìm xem liệu regex có r
khớp với chuỗi đó hay không (và trả về một đối tượng khớp tương ứng nếu có, nhưng điều đó không quan trọng trong trường hợp này vì chúng tôi chỉ quan tâm xem kết quả có đúng hay không)
Ví dụ đầy đủ (Python 3):
Đối với Python 2.x, hãy xem Ghi chú bên dưới
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
Bản in:
['cat', 'wildcat', 'thundercat']
Ghi chú:
Đối với các nhà phát triển Python 2.x, filter
trả về một danh sách đã có. Trong Python, 3.xfilter
đã được thay đổi để trả về một trình lặp, vì vậy nó phải được chuyển đổi thành list
(để xem nó được in ra đẹp mắt).
<filter object at 0x1057acda0>
Tôi đang làm gì sai?
str
từ filter
lợi nhuận một danh sách dù sao, không có kết quả ...
print(list(newlist))
hayprint([i for i in newlist])
Để làm như vậy mà không cần biên dịch Regex trước, hãy sử dụng một lambda
hàm - ví dụ:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
Lợi nhuận:
['123', '234']
filter()
chỉ lấy một callable
là đối số đầu tiên và trả về một danh sách trong đó có thể gọi đó trả về giá trị 'true'.