Դրական և բացասական դիտումներ 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'
Ստացեք ենթատողերը, որոնցից առաջ գալիս է դոլարի նշան: