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'-дан басқа) болуы мүмкін.