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:

pythontxt = '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:

pythontxt = '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:

pythontxt = '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:

pythontxt = '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':

pythontxt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)

print(res) # kiírja 'b!'

Gyakorlati feladatok

Задание 1

Adott egy sztring, amely függvényneveket tartalmaz:

pythontxt = 'func1() func2() func3()'

Kapja meg a függvénynevek tömbjét a sztringből.

Задание 2

Adott egy sztring egy taggel:

pythontxt = '<a href="" class="eee" id="zzz">'

Kapja meg a tag attribútumainak neveit tartalmazó tömböt.

Задание 3

Adott egy sztring változókkal:

pythontxt = '$aaa $bbb $ccc xxxx'

Kapja meg azon részsztringeket, amelyek előtt dollárjel áll.