2012-05-29 19 views

risposta

7

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.

+0

Grazie, ma come fa questa espressione regolare corrisponde all'indirizzo MAC "00: 07: 32: 12: ac: de: ef" – Hari

+0

@rawb ... funziona e anche questo come un gruppo re.findall lo stampa come un singolo gruppo – Hari

5

Utilizzando ?: come nel (?:...) rende il gruppo non-cattura durante la sostituzione. Durante la ricerca non ha alcun senso.

tuo RegEx significa

r""" 
(     # Match the regular expression below and capture its match into backreference number 1 
    [\dA-Fa-f]   # Match a single character present in the list below 
          # A single digit 0..9 
          # A character in the range between “A” and “F” 
          # A character in the range between “a” and “f” 
     {2}     # Exactly 2 times 
    (?:     # Match the regular expression below 
     [:-]    # Match a single character present in the list below 
          # The character “:” 
          # The character “-” 
     [\dA-Fa-f]   # Match a single character present in the list below 
          # A single digit 0..9 
          # A character in the range between “A” and “F” 
          # A character in the range between “a” and “f” 
     {2}     # Exactly 2 times 
    ){5}    # Exactly 5 times 
) 
""" 

Spero che questo aiuti.

+0

Grazie, ma come fa questa espressione regolare corrisponde all'indirizzo MAC "00: 07: 32: 12: ac: de: ef" – Hari

+0

ya funziona .. grazie ... ma voglio la risposta come gruppo singolo – Hari

+0

Prova questo '' (? is) \ b (?: [A-F0-9] {2}) (? :: [A-F0-9] {2}) {6} ''. – Cylian

1

(?:...) significa un gruppo non di tipo. Il gruppo non verrà catturato.

Problemi correlati