ฉันจะค้นหาการแข่งขันทั้งหมดในนิพจน์ทั่วไปใน Python ได้อย่างไร


312

ในโปรแกรมที่ฉันเขียนฉันมี Python ใช้re.search()ฟังก์ชั่นเพื่อค้นหารายการที่ตรงกันในบล็อกข้อความและพิมพ์ผลลัพธ์ อย่างไรก็ตามโปรแกรมจะออกเมื่อพบคู่แรกในบล็อกข้อความ

ฉันจะทำสิ่งนี้ซ้ำ ๆ ได้อย่างไรเมื่อโปรแกรมไม่หยุดจนกว่าจะพบการแข่งขันทั้งหมด มีฟังก์ชั่นแยกการทำเช่นนี้?


REs แบบเรียกซ้ำเป็นสัตว์ร้ายตัวอื่น คุณต้องการค้นหาซ้ำ
outis

คำตอบ:


545

ใช้re.findallหรือre.finditerแทน

re.findall(pattern, string) ส่งคืนรายการของสตริงที่ตรงกัน

re.finditer(pattern, string)ส่งคืนตัววนซ้ำบนMatchObjectวัตถุ

ตัวอย่าง:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']

18
finditerคือสิ่งที่ฉันกำลังมองหา ฉันประหลาดใจที่มีการส่งคืนการจับคู่วัตถุและสตริงอื่น ๆ ฉันคาดหวังว่าจะใช้match_allหรือmatch_iterฟังก์ชั่น
dsclose

21
การปฏิเสธความรับผิด: ผู้ที่จะได้พบกับการแข่งขันที่ไม่ทับซ้อนเท่านั้น
Antoine Lizée

3
@ AntoineLizéeใครจะพบว่ามีการซ้ำซ้อน?
Raksha

16
@Raksha - ใช้re.searchในการวนซ้ำ มันจะส่งคืนMatchวัตถุ คุณจะต้องผ่านMatch.start() + 1เป็นposอาร์กิวเมนต์re.searchสำหรับการวนซ้ำครั้งถัดไปของลูป
ArtOfWarfare

3
หากการแข่งขันมีมากกว่าหนึ่งกลุ่มfindallจะส่งคืนรายการของสิ่งอันดับที่ตรงกันไม่ใช่รายการของสตริงที่ตรงกัน
rodorgas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.