Python регуляркаларындагы позитивдүү жана негативдүү көрүү

Кээде мындай маселени чыгаруу керек болот: 'aaa' сапты таап, '!' менен алмаштыруу, бирок ал эгерде 'aaa'дан кийин 'x' турган гана учурда, ал эми 'x' өзү алмаштырылбайт. Эгер биз маселени 'түздөн-түз' чыгарып көрсөк, анда ийгиликке ээ болбойбуз:

pythontxt = 'aaax baaa'
res = re.sub('aaax', '!', txt)

print(res) # '! baaa' чыгарат, биз '!x baaa' деп күткөнбүз

Алдыга көрүү

Маселени чыгаруу үчүн, 'x' алмаштырылбашы керек деп айтуу ыкмасы керек. Бул (?= ) атайын кашаалары менен жасалат, алар жөн гана көрүп, өзү менен алып кетпейт.

Бул кашаалар позитивдүү алдыга көрүү деп аталат. Позитивдүү - анткени 'x' (биздин учурда) болушу керек - ал гана учурда алмаштыруу ишке ашат.

Келгиле, бул кашааларды биздин маселени чыгаруу үчүн колдонолу:

pythontxt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # '!x aaab' чыгарат

Негативдүү алдыга көрүү да бар - (?! ) - ал, тескерисинче, бир нерсе болбошу керек деп айтат. Кийинки мисалда, алмаштыруу 'aaa'дан кийин 'x' ЭМЕС турган гана учурда ишке ашат:

pythontxt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)

print(res) # 'aaax !b' чыгарат

Артка көрүү

Ошол сыяктуу эле позитивдүү артка көрүү бар - (?<= ). Кийинки мисалда алмаштыруу, ал эгерде 'aaa'дан мурун 'x' турган гана учурда ишке ашат:

pythontxt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)

print(res) # 'x!' чыгарат

Ошондой эле негативдүү артка көрүү да бар - (?<! ). Кийинки мисалда алмаштыруу, ал эгерде 'aaa'дан мурун 'x' турбаса гана учурда ишке ашат:

pythontxt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)

print(res) # 'b!' чыгарат

Практикалык маселелер

Задание 1

Функциялардын аттарын камтыган сап берилген:

pythontxt = 'func1() func2() func3()'

Саптан функциялардын аттарынын массивин алыңыз.

Задание 2

Тег менен сап берилген:

pythontxt = '<a href="" class="eee" id="zzz">'

Бул тегдин атрибуттарынын аттарынын массивин алыңыз.

Задание 3

Өзгөрмөлөр менен сап берилген:

pythontxt = '$aaa $bbb $ccc xxxx'

Алдында доллар белгиси турган подсаптарды алыңыз.