Python-da regulýar ifadeleriň halawarlygyny çäklendirmek
Regulýar ifadeler adatça halawarly. Bu olaryň iň köp mümkin bolan nyşanlary alýandygyny aňladýar. Bir mysal bilen seredeliň. Bizde şeýle bir setir bolsun:
txt = 'aeeex zzz x kkk'
Bu setirde biz şablon boýunça
'aeeex' aşaky setirini tapmak isleýäris:
nyşan 'a', soňra islendik nyşan
bir ýa-da birnäçe gezek, soňra nyşan 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Biz '! zzz
x kkk' setirini almaly bolsak-da, '! kkk' setiri çykar.
Sebäbi, bizniň regulýar ifademiz
'a' nyşanyndan 'x' nyşanyna çenli ähli nyşanlary gözleýär.
Ýöne bizniň setirimizde iki sany 'x' nyşany bar!
Halawarlyk sebäpli regulýar ifade iň soňky x-e çenli gözleýär,
şonuň üçin bize gerek bolmadygy alýar.
Elbetde, köplenç bu hereket bize gerek bolýar. Ýöne bu ýagdaýda halawarlygy ýatyryp, regulýar ifade birinji x-e çenli gözlemelidigini aýtmaly. Bu ýagda gaýtalanma operatorundan soň sorag nyşanyny goýmaly:
res = re.sub('a.+?x', '!', txt)
print(res) # '! zzz x kkk' setirini çykarar
Halawarlygy ähli gaýtalanma operatorlaryna çäklendirip bolýar: * hem, ? hem,
{} hem - şeýlelikde: *?, ??
we {}?.
Setir berlen:
txt = 'aba accca azzza wwwwa'
Gyrlarında 'a' nyşanlary duran ähli
setirleri tapýan we olaryň her birini
'!' bilen çalşýan regulýar ifade ýazyň.
'a' nyşanlarynyň arasynda islendik nyşan ('a' başga) bolup biler.