Դրական և բացասական դիտումներ 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'

Ստացեք ենթատողերը, որոնցից առաջ գալիս է դոլարի նշան: