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:
txt = '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:
res = 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:
res = 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 {}?.
Şu dize verilmiştir:
txt = '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.