ฉันต้องการกรองสตริงในรายการโดยยึดตามนิพจน์ทั่วไป
จะมีอะไรดีไปกว่า[x for x in list if r.match(x)]
?
ฉันต้องการกรองสตริงในรายการโดยยึดตามนิพจน์ทั่วไป
จะมีอะไรดีไปกว่า[x for x in list if r.match(x)]
?
คำตอบ:
คุณสามารถสร้างตัววนซ้ำใน Python 3.x หรือรายการใน Python 2.x โดยใช้:
filter(r.match, list)
ในการแปลงตัววนซ้ำ Python 3.x เป็นรายการเพียงแค่ส่งมัน list(filter(..))
.
filter
เวอร์ชันมีความชัดเจนและมีเสียงรบกวนน้อยกว่ามาก
r.match
นี่คืออะไร?
r.match
เป็นวิธีการที่เมื่อนำไปใช้กับสตริงที่กำหนดพบว่า regex r
ตรงกับสตริงนั้นหรือไม่ (และส่งคืนอ็อบเจ็กต์การจับคู่ที่ตรงกันหากเป็นเช่นนั้น แต่ไม่สำคัญในกรณีนี้เนื่องจากเราสนใจว่าผลลัพธ์จะเป็นจริงหรือไม่)
ตัวอย่างเต็ม (Python 3):
สำหรับ Python 2.x ให้ดูที่หมายเหตุด้านล่าง
import re
mylist = ["dog", "cat", "wildcat", "thundercat", "cow", "hooo"]
r = re.compile(".*cat")
newlist = list(filter(r.match, mylist)) # Read Note
print(newlist)
พิมพ์:
['cat', 'wildcat', 'thundercat']
บันทึก:
สำหรับนักพัฒนา Python 2.x filter
ส่งคืนรายการแล้ว ในPython 3.xfilter
ถูกเปลี่ยนเพื่อส่งคืนตัววนซ้ำดังนั้นจึงต้องถูกแปลงเป็นlist
(เพื่อให้เห็นว่าพิมพ์ออกมาได้ดี)
str
ตั้งแต่filter
ส่งคืนรายการอยู่ดี แต่ก็ไม่มีประโยชน์ ...
print(list(newlist))
หรือprint([i for i in newlist])
ในการดำเนินการดังกล่าวโดยไม่ต้องรวบรวม Regex ก่อนให้ใช้lambda
ฟังก์ชัน - ตัวอย่างเช่น:
from re import match
values = ['123', '234', 'foobar']
filtered_values = list(filter(lambda v: match('^\d+$', v), values))
print(filtered_values)
ผลตอบแทน:
['123', '234']
filter()
เพียงแค่รับcallable
เป็นอาร์กิวเมนต์แรกและส่งกลับรายการที่เรียกได้ว่าส่งคืนค่า 'จริง'