Pozitīvā un negatīvā izlūkošana Python regulārajās izteiksmēs
Dažreiz ir jāatrisina šāda veida uzdevums:
atrast virkni 'aaa' un aizstāt to
ar '!', bet tikai tad, ja aiz
'aaa' atrodas 'x', bet pašu
'x' nemaina. Ja mēs mēģināsim
atrisināt uzdevumu 'tieši',
tad mums nekas neizdosies:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # izvadīs '! baaa', bet vēlējāmies '!x baaa'
Izlūkošana uz priekšu
Lai atrisinātu uzdevumu, ir vajadzīgs veids, kā pateikt,
ka 'x' nevajadzētu aizstāt. Tas tiek darīts
ar speciālo iekavu (?= ) palīdzību,
kas tikai skatās, bet nepaņem līdzi.
Šīs iekavas sauc par pozitīvo izlūkošanu uz priekšu. Pozitīvs - jo 'x'
(mūsu gadījumā) ir jāatrodas - tikai tad
notiks aizstāšana.
Izmantosim šīs iekavas, lai atrisinātu mūsu uzdevumu:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # izvadīs '!x aaab
Pastāv arī negatīvā izlūkošana uz priekšu
- (?! ) - tā, gluži pretēji, saka,
ka kaut kam nevajadzētu atrasties. Nākamajā
piemērā aizstāšana notiks tikai tad, ja
aiz 'aaa' atrodas NE 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # izvadīs 'aaax !b'
Izlūkošana atpakaļ
Līdzīgi pastāv pozitīvā
izlūkošana atpakaļ - (?<= ).
Nākamajā piemērā aizstāšana notiks tikai
tad, ja pirms 'aaa' atrodas 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # izvadīs 'x!'
Un pastāv arī negatīvā izlūkošana atpakaļ
- (?<! ). Nākamajā piemērā
aizstāšana notiks tikai tad, ja pirms
'aaa' neatrodas 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # izvadīs 'b!'
Praktiskie uzdevumi
Dota virkne, kas satur funkciju nosaukumus:
txt = 'func1() func2() func3()'
Iegūstiet funkciju nosaukumu masīvu no virknes.
Dota virkne ar tagu:
txt = '<a href="" class="eee" id="zzz">'
Iegūstiet šī taga atribūtu nosaukumu masīvu.
Dota virkne ar mainīgajiem:
txt = '$aaa $bbb $ccc xxxx'
Iegūstiet apakšvirknes, pirms kurām atrodas dolāra zīme.