การจำกัดความโลภใน regex ใน Python

โดยค่าเริ่มต้น นิพจน์ทั่วไปนั้น โลภ ซึ่งหมายความว่าพวกมันจะจับกลุ่ม ตัวอักษรจำนวนมากที่สุดเท่าที่เป็นไปได้ มาดูตัวอย่างกัน สมมติว่าเรามี สตริงแบบนี้:

pythontxt = 'aeeex zzz x kkk'

ในสตริงนี้เราต้องการค้นหาสตริงย่อย 'aeeex' โดยใช้รูปแบบดังนี้: ตัวอักษร 'a' ตามด้วยตัวอักษรใดๆ หนึ่งตัวหรือมากกว่า จากนั้นตัวอักษร 'x':

pythonres = re.sub('a.+x', '!', txt)
print(res)

แม้ว่าเราต้องการได้สตริง '! zzz x kkk' แต่ผลลัพธ์ที่ได้จะเป็นสตริง '! kkk' สาเหตุทั้งหมดอยู่ที่ว่า regex ของเราค้นหา ตัวอักษรทั้งหมดจากตัวอักษร 'a' ไปจนถึงตัวอักษร 'x' แต่ในสตริงของเรามีตัวอักษร 'x' สองตัว! เนื่องจากความโลภ ทำให้ regex ค้นหาไปจนถึงตัวสุดท้าย จึงจับกลุ่มได้ไม่ตรงกับสิ่งที่เราต้องการ

แน่นอนว่าบ่อยครั้งพฤติกรรมเช่นนี้คือสิ่งที่เรา ต้องการ แต่ในกรณีนี้จำเป็นต้อง ยกเลิกความโลภและบอก regex ให้ค้นหาไปจนถึงตัว x ตัวแรกเท่านั้น ใน กรณีนี้ควรใส่เครื่องหมายคำถามหลังโอเปอเรเตอร์การทำซ้ำ:

pythonres = re.sub('a.+?x', '!', txt)
print(res) # จะได้สตริง '! zzz x kkk'

สามารถจำกัดความโลภให้กับโอเปอเรเตอร์การทำซ้ำ ทั้งหมดได้: ทั้ง *, ? และ {} - แบบนี้: *?, ?? และ {}?

Задание 1

กำหนดสตริง:

pythontxt = 'aba accca azzza wwwwa'

เขียน regex ที่จะค้นหา สตริงทั้งหมดที่มีตัวอักษร 'a' อยู่ที่ขอบทั้งสองด้าน และแทนที่แต่ละสตริงด้วย '!' ระหว่างตัวอักษร 'a' สามารถมี ตัวอักษรใดๆ (ยกเว้น 'a') ก็ได้