Python регуляркаларындагы позитивдүү жана негативдүү көрүү
Кээде мындай маселени чыгаруу керек болот:
'aaa' сапты таап,
'!' менен алмаштыруу, бирок ал эгерде
'aaa'дан кийин 'x' турган гана учурда, ал эми
'x' өзү алмаштырылбайт. Эгер биз
маселени 'түздөн-түз' чыгарып көрсөк,
анда ийгиликке ээ болбойбуз:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # '! baaa' чыгарат, биз '!x baaa' деп күткөнбүз
Алдыга көрүү
Маселени чыгаруу үчүн, 'x' алмаштырылбашы керек деп айтуу ыкмасы керек.
Бул (?= ) атайын кашаалары менен жасалат,
алар жөн гана көрүп, өзү менен алып кетпейт.
Бул кашаалар позитивдүү алдыга көрүү деп аталат.
Позитивдүү - анткени 'x'
(биздин учурда) болушу керек - ал гана учурда
алмаштыруу ишке ашат.
Келгиле, бул кашааларды биздин маселени чыгаруу үчүн колдонолу:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # '!x aaab' чыгарат
Негативдүү алдыга көрүү да бар
- (?! ) - ал, тескерисинче,
бир нерсе болбошу керек деп айтат. Кийинки
мисалда, алмаштыруу 'aaa'дан кийин 'x' ЭМЕС турган гана учурда ишке ашат:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # 'aaax !b' чыгарат
Артка көрүү
Ошол сыяктуу эле позитивдүү
артка көрүү бар - (?<= ).
Кийинки мисалда алмаштыруу, ал эгерде
'aaa'дан мурун 'x' турган гана учурда ишке ашат:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # 'x!' чыгарат
Ошондой эле негативдүү артка көрүү
да бар - (?. Кийинки мисалда
алмаштыруу, ал эгерде 'aaa'дан мурун
'x' турбаса гана учурда ишке ашат:
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # 'b!' чыгарат
Практикалык маселелер
Функциялардын аттарын камтыган сап берилген:
txt = 'func1() func2() func3()'
Саптан функциялардын аттарынын массивин алыңыз.
Тег менен сап берилген:
txt = '<a href="" class="eee" id="zzz">'
Бул тегдин атрибуттарынын аттарынын массивин алыңыз.
Өзгөрмөлөр менен сап берилген:
txt = '$aaa $bbb $ccc xxxx'
Алдында доллар белгиси турган подсаптарды алыңыз.