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(..)).
filterphiên bản hoàn toàn rõ ràng và ít nhiễu hơn nhiều.
r.matchở đây?
r.matchlà 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ó rkhớ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, filtertrả 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?
strtừ filterlợ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 lambdahà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 callablelà đối số đầu tiên và trả về một danh sách trong đó có thể gọi đó trả về giá trị 'true'.