Python регуляр ифодаларида мусбат ва салбий кўриб чиқиш

Бaъзан шундай вазифани ечиш керак бўлади: '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'

Олдида доллар белгиси турган қисм сатрларни олинг.