Lookahead e Lookbehind Positivo e Negativo nelle Espressioni Regolari di Python

A volte è necessario risolvere un problema di questo tipo: trovare la stringa 'aaa' e sostituirla con '!', ma solo se dopo 'aaa' c'è 'x', mentre 'x' stesso non deve essere sostituito. Se proviamo a risolvere il problema 'di forza bruta', non avremo successo:

pythontxt = 'aaax baaa'
res = re.sub('aaax', '!', txt)

print(res) # restituirà '! baaa', ma volevamo '!x baaa'

Lookahead

Per risolvere il problema, serve un modo per dire che 'x' non deve essere sostituito. Questo si fa utilizzando parentesi speciali (?= ), che semplicemente "guardano", ma non consumano i caratteri.

Queste parentesi sono chiamate lookahead positivo. Positivo - perché 'x' (nel nostro caso) deve essere presente - solo allora avverrà la sostituzione.

Applichiamo queste parentesi per risolvere il nostro problema:

pythontxt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # restituirà '!x baaa'

Esiste anche il lookahead negativo - (?! ) - che, al contrario, dice che qualcosa non deve essere presente. Nel prossimo esempio, la sostituzione avverrà solo se dopo 'aaa' NON c'è 'x':

pythontxt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)

print(res) # restituirà 'aaax !b'

Lookbehind

Analogamente, esiste il lookbehind positivo - (?<= ). Nel prossimo esempio la sostituzione avverrà solo se prima di 'aaa' c'è 'x':

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

print(res) # restituirà 'x!'

Ed esiste anche il lookbehind negativo - (?<! ). Nel prossimo esempio la sostituzione avverrà solo se prima di 'aaa' NON c'è 'x':

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

print(res) # restituirà 'b!'

Problemi Pratici

Задание 1

Data una stringa contenente nomi di funzioni:

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

Ottieni un array dei nomi delle funzioni dalla stringa.

Задание 2

Data una stringa con un tag:

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

Ottieni un array dei nomi degli attributi di questo tag.

Задание 3

Data una stringa con variabili:

pythontxt = '$aaa $bbb $ccc xxxx'

Ottieni le sottostringhe che sono precedute dal simbolo del dollaro.