Il numero (?:...)
indica un insieme di parentesi di raggruppamento non acquisite.
Normalmente, quando si scrive (...)
in un'espressione regolare, "acquisisce" il materiale corrispondente. Quando si utilizza la versione non acquisibile, non acquisisce.
È possibile ottenere le varie parti corrispondenti allo regex utilizzando i metodi nel pacchetto re
dopo che l'espressione regolare corrisponde a una stringa particolare.
Come funziona questa espressione regolare partita indirizzo MAC "00: 07: 32: 12: ac: de: ef"?
Questa è una domanda diversa da quella che inizialmente hai chiesto. Tuttavia, la parte regex è:
([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5})
Il più coppia esterna di parentesi sono catturando parentesi; ciò che circonda sarà disponibile quando si utilizza correttamente la regex su una stringa.
La parte [\dA-Fa-f]{2}
corrisponde una cifra (\d
) o le cifre esadecimali A-Fa-f]
, in una coppia {2}
, seguito da un non-cattura raggruppamento dove il materiale corrispondente è un colon o trattino (:
o -
), seguita da un'altra coppia di cifre esadecimali, con il tutto ripetuto esattamente 5 volte.
p = re.compile(([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5}))
m = p.match("00:07:32:12:ac:de:ef")
if m:
m.group(1)
L'ultima riga deve stampare la stringa "00: 07: 32: 12: ac: de" perché questa è la prima serie di 6 coppie di cifre esadecimali (su sette coppie in totale nella stringa). In effetti, le parentesi di raggruppamento esterne sono ridondanti e se omesse, m.group(0)
funzionerebbe (funziona anche con loro). Se è necessario abbinare 7 coppie, quindi si modifica la 5 in un 6. Se avete bisogno di rifiutarli, allora si sarebbe messo ancore nella regex:
p = re.compile(^([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5})$)
L'accento circonflesso ^
corrisponde l'inizio di corda; il dollaro $
corrisponde alla fine della stringa. Con il 5, ciò non corrisponderebbe alla stringa di esempio. Con 6 in luogo di 5, corrisponderebbe alla stringa.
Grazie, ma come fa questa espressione regolare corrisponde all'indirizzo MAC "00: 07: 32: 12: ac: de: ef" – Hari
@rawb ... funziona e anche questo come un gruppo re.findall lo stampa come un singolo gruppo – Hari