Pozitív és negatív előre- és hátranézés a Python reguláris kifejezéseiben
Időnként a következő típusú feladatot kell megoldanunk:
keressük meg a(z) 'aaa' sztringet és cseréljük ki
a(z) '!' sztringre, de csak akkor, ha
a(z) 'aaa' után 'x' áll, magát
a(z) 'x'-et pedig ne cseréljük ki. Ha a feladatot
'közvetlenül' próbáljuk megoldani,
akkor nem fog sikerülni:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # kiírja '! baaa', de mi '!x baaa'-t szeretnénk
Előrenézés
A feladat megoldásához szükség van egy módszerre, amivel
elmondhatjuk, hogy a(z) 'x'-et ne cseréljük ki. Ezt
a speciális zárójelek segítségével tehetjük meg: (?= ),
amelyek csak "néznek", de nem "fogyasztják" a karaktereket.
Ezeket a zárójeleket pozitív előrenézésnek nevezzük.
Pozitív - mert a(z) 'x'-nek
(a mi esetünkben) jelen kell lennie - csak akkor
történik meg a csere.
Alkalmazzuk ezeket a zárójeleket a feladatunk megoldására:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # kiírja '!x aaab
Létezik negatív előrenézés is
- (?! ) - ez éppen ellenkezőleg azt mondja,
hogy valaminek nem szabad jelen lennie. A következő
példában a csere csak akkor történik meg, ha
a(z) 'aaa' után NEM 'x' áll:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # kiírja 'aaax !b'
Hátranézés
Hasonló módon létezik pozitív
hátranézés is - (?<= ). A
következő példában a csere csak akkor történik meg, ha
a(z) 'aaa' előtt 'x' áll:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # kiírja 'x!'
És létezik negatív hátranézés is
- (?<! ). A következő példában
a csere csak akkor történik meg, ha a(z)
'aaa' előtt nem áll 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # kiírja 'b!'
Gyakorlati feladatok
Adott egy sztring, amely függvényneveket tartalmaz:
txt = 'func1() func2() func3()'
Kapja meg a függvénynevek tömbjét a sztringből.
Adott egy sztring egy taggel:
txt = '<a href="" class="eee" id="zzz">'
Kapja meg a tag attribútumainak neveit tartalmazó tömböt.
Adott egy sztring változókkal:
txt = '$aaa $bbb $ccc xxxx'
Kapja meg azon részsztringeket, amelyek előtt dollárjel áll.