การจำกัดความโลภใน regex ใน Python
โดยค่าเริ่มต้น นิพจน์ทั่วไปนั้น โลภ ซึ่งหมายความว่าพวกมันจะจับกลุ่ม ตัวอักษรจำนวนมากที่สุดเท่าที่เป็นไปได้ มาดูตัวอย่างกัน สมมติว่าเรามี สตริงแบบนี้:
txt = 'aeeex zzz x kkk'
ในสตริงนี้เราต้องการค้นหาสตริงย่อย
'aeeex' โดยใช้รูปแบบดังนี้:
ตัวอักษร 'a' ตามด้วยตัวอักษรใดๆ
หนึ่งตัวหรือมากกว่า จากนั้นตัวอักษร 'x':
res = re.sub('a.+x', '!', txt)
print(res)
แม้ว่าเราต้องการได้สตริง '! zzz
x kkk' แต่ผลลัพธ์ที่ได้จะเป็นสตริง '! kkk'
สาเหตุทั้งหมดอยู่ที่ว่า regex ของเราค้นหา
ตัวอักษรทั้งหมดจากตัวอักษร 'a' ไปจนถึงตัวอักษร
'x' แต่ในสตริงของเรามีตัวอักษร 'x' สองตัว!
เนื่องจากความโลภ ทำให้ regex ค้นหาไปจนถึงตัวสุดท้าย
จึงจับกลุ่มได้ไม่ตรงกับสิ่งที่เราต้องการ
แน่นอนว่าบ่อยครั้งพฤติกรรมเช่นนี้คือสิ่งที่เรา ต้องการ แต่ในกรณีนี้จำเป็นต้อง ยกเลิกความโลภและบอก regex ให้ค้นหาไปจนถึงตัว x ตัวแรกเท่านั้น ใน กรณีนี้ควรใส่เครื่องหมายคำถามหลังโอเปอเรเตอร์การทำซ้ำ:
res = re.sub('a.+?x', '!', txt)
print(res) # จะได้สตริง '! zzz x kkk'
สามารถจำกัดความโลภให้กับโอเปอเรเตอร์การทำซ้ำ
ทั้งหมดได้: ทั้ง *, ? และ
{} - แบบนี้: *?, ??
และ {}?
กำหนดสตริง:
txt = 'aba accca azzza wwwwa'
เขียน regex ที่จะค้นหา
สตริงทั้งหมดที่มีตัวอักษร
'a' อยู่ที่ขอบทั้งสองด้าน และแทนที่แต่ละสตริงด้วย
'!' ระหว่างตัวอักษร 'a' สามารถมี
ตัวอักษรใดๆ (ยกเว้น 'a') ก็ได้