Python'da Düzenli İfadelerde Açgözlülüğü Sınırlama

Düzenli ifadeler varsayılan olarak açgözlüdür. Bu, mümkün olan en fazla karakteri yakaladıkları anlamına gelir. Bir örnekle inceleyelim. Diyelim ki elimizde şöyle bir dize var:

pythontxt = 'aeeex zzz x kkk'

Bu dizede, 'aeeex' alt dizesini şu kalıba göre bulmak istiyoruz: 'a' harfi, ardından herhangi bir karakter bir veya daha fazla kez, ardından 'x' harfi:

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

'! zzz x kkk' dizesini elde etmemiz gerekirken, '! kkk' dizesi yazdırılacaktır. Bunun nedeni, düzenli ifademizin 'a' harfinden 'x' harfine kadar olan tüm karakterleri aramasıdır. Ancak dizimizde iki tane 'x' harfi var! Açgözlülük nedeniyle, düzenli ifade sonuncu 'x'e kadar arama yapar ve böylece aslında ihtiyacımız olmayan kısmı da yakalamış olur.

Elbette, çoğu zaman bu davranış tam da ihtiyacımız olan şeydir. Ancak bu özel durumda açgözlülüğü iptal etmemiz ve düzenli ifadeye ilk 'x'e kadar arama yapmasını söylememiz gerekir. Bu durumda, tekrarlama operatöründen sonra soru işareti konulmalıdır:

pythonres = re.sub('a.+?x', '!', txt)
print(res) # '! zzz x kkk' dizesini yazdırır

Açgözlülük tüm tekrarlama operatörleri için sınırlandırılabilir: *, ? ve {} - şu şekilde: *?, ?? ve {}?.

Задание 1

Şu dize verilmiştir:

pythontxt = 'aba accca azzza wwwwa'

Kenarlarında 'a' harfleri bulunan tüm dizeleri bulacak ve her birini '!' ile değiştirecek bir düzenli ifade yazın. 'a' harfleri arasında ('a' hariç) herhangi bir karakter bulunabilir.