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:

pythontxt = 'abab123'
res = re.search('(ab)+([1-9]+)', txt)

Di conseguenza, nei nostri gruppi ci sarà quanto segue:

pythonprint(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:

pythontxt = 'abab123'
res = re.search('(?:ab)+([1-9]+)', txt)

Di conseguenza, nel primo gruppo ci sarà il nostro numero:

pythonprint(res[1]) # visualizzerà '123'