ฉันต้องการกรองสตริงในรายการโดยยึดตามนิพจน์ทั่วไป
จะมีอะไรดีไปกว่า[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เป็นอาร์กิวเมนต์แรกและส่งกลับรายการที่เรียกได้ว่าส่งคืนค่า 'จริง'