Կանոնավոր արտահայտությունների ագահությունը սահմանափակելը Python-ում
Կանոնավոր արտահայտությունները լռելյայն ագահ են: Սա նշանակում է, որ դրանք գրավում են հնարավոր առավելագույն թվով նիշեր: Եկեք դիտարկենք օրինակով: Ենթադրենք ունենք հետևյալ տողը:
txt = 'aeeex zzz x kkk'
Այս տողում ցանկանում ենք գտնել
'aeeex' ենթատողը՝ համաձայն հետևյալ կաղապարի.
տառ 'a', ապա ցանկացած նիշ
մեկ կամ ավելի անգամ, ապա 'x' տառը:
res = re.sub('a.+x', '!', txt)
print(res)
Չնայած մեզ անհրաժեշտ է ստանալ '! zzz
x kkk' տողը, կցուցադրվի '! kkk' տողը:
Ամբողջ բանը նրանում է, որ մեր կանոնավոր արտահայտությունը փնտրում է
բոլոր նիշերը 'a' տառից մինչև
'x' տառը: Բայց մեր տողում կա երկու
'x' տառ: Ագահության պատճառով ստացվում է, որ
կանոնավոր արտահայտությունը փնտրում է մինչև ամենավերջին x-ը,
այդպիսով գրավելով ոչ այն, ինչ մեզ
էին պետք:
Իհարկե, հաճախ հենց այդպիսի վարքագիծ է մեզ էլ պետք: Բայց հենց այս դեպքում անհրաժեշտ է չեղարկել ագահությունը և հրահանգել կանոնավոր արտահայտությանը, որ այն փնտրի մինչև առաջին x-ը: Այս դեպքում կրկնության օպերատորից հետո պետք է դնել հարցականի նշան:
res = re.sub('a.+?x', '!', txt)
print(res) # կցուցադրի '! zzz x kkk' տողը
Կրկնության բոլոր օպերատորներին կարելի է սահմանափակել ագահությունը.
և՛ *, և՛ ?, և՛
{} - ահա այսպես. *?, ??
և {}?:
Տրված է տողը.
txt = 'aba accca azzza wwwwa'
Գրեք կանոնավոր արտահայտություն, որը կգտնի բոլոր
տողերը, որոնց եզրերում կան
'a' տառերը, և կփոխարինի դրանցից յուրաքանչյուրը
'!'-ով: 'a' տառերի միջև կարող է
լինել ցանկացած նիշ (բացի 'a'-ից):