Parentesi non catturanti nelle espressioni regolari di Python
Le parentesi ( ) svolgono due funzioni:
raggruppare i caratteri e la funzione di cattura (capturing group).
E cosa fare se è necessario raggruppare, ma
non voler catturare? Per risolvere questo problema
sono state introdotte le speciali parentesi non catturanti
(non-capturing parentheses) (?: ) - raggruppano,
ma non catturano in un gruppo.
Esempio
Nel seguente esempio, le prime parentesi ci servono per il raggruppamento, mentre le seconde - per la cattura. Tuttavia, entrambe le parentesi catturano i dati in un gruppo:
txt = 'abab123'
res = re.search('(ab)+([1-9]+)', txt)
Di conseguenza, nei nostri gruppi ci sarà quanto segue:
print(res[0]) # visualizzerà 'abab123'
print(res[1]) # visualizzerà 'ab'
print(res[2]) # visualizzerà '123'
Esempio
Modifichiamo in modo che la prima coppia di parentesi solo raggruppi, ma non catturi in un gruppo:
txt = 'abab123'
res = re.search('(?:ab)+([1-9]+)', txt)
Di conseguenza, nel primo gruppo ci sarà il nostro numero:
print(res[1]) # visualizzerà '123'