2012-05-29 22 views

Respuesta

7

(?:...) significa un conjunto de paréntesis de agrupamiento que no se capturan.

Normalmente, cuando escribe (...) en una expresión regular, 'captura' el material coincidente. Cuando usa la versión que no captura, no captura.

Puede obtener las diversas partes que coincidan con el regex utilizando los métodos del paquete re después de que la expresión regular coincida con una cadena en particular.


¿Cómo funciona esta coincidencia de expresiones regulares dirección MAC "00: 07: 32: 12: ac: de: ef"?

Esa es una pregunta diferente a la que inicialmente se le preguntó. Sin embargo, la parte de la expresión regular es:

([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5}) 

El par más exterior de paréntesis está capturando paréntesis; lo que rodean estará disponible cuando utilice la expresión regular contra una cadena con éxito.

La parte [\dA-Fa-f]{2} partidos un dígito (\d) o los dígitos hexadecimales A-Fa-f], en un par {2}, seguido por un no captura la agrupación donde el material emparejado es un colon o guión (: o -), seguido de otro par de dígitos hexadecimales, con el todo repetido exactamente 5 veces.

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) 

La última línea debe imprimir la cadena "00: 07: 32: 12: ac: de" porque esa es la primera serie de 6 pares de dígitos hexadecimales (de los siete pares en total en la cadena de) De hecho, los paréntesis de agrupación externa son redundantes y si se omiten, m.group(0) funcionaría (funciona incluso con ellos). Si usted necesita para que coincida con 7 pares, a continuación, cambia el 5 en un 6. Si tiene que rechazarlas, a continuación, que había puesto anclajes en la expresión regular:

p = re.compile(^([\dA-Fa-f]{2}(?:[:-][\dA-Fa-f]{2}){5})$) 

El símbolo de intercalación ^ coincide con el inicio de la cadena; el dólar $ coincide con el final de la cadena. Con el 5, eso no coincidiría con su cadena de muestra. Con 6 en lugar de 5, coincidiría con su cadena.

+0

Gracias, pero ¿cómo esta expresión regular coincide con la dirección MAC "00: 07: 32: 12: ac: de: ef" – Hari

+0

@rawb ... funciona y eso también como un grupo re.findall lo imprime como un solo grupo – Hari

5

Usando ?: como en (?:...) hace que el grupo no captura durante reemplazar. Durante la búsqueda, no tiene sentido.

Su 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 
) 
""" 

Espero que esto ayude.

+0

Gracias, pero ¿cómo esta expresión regular coincide con la dirección MAC "00: 07: 32: 12: ac: de: ef" – Hari

+0

ya funciona ... gracias ... pero quiero la respuesta como un solo grupo – Hari

+0

Prueba esto '' (? es) \ b (?: [A-F0-9] {2}) (? :: [A-F0-9] {2}) {6} ''. – Cylian

1

(?:...) significa un grupo no selectivo. El grupo no será capturado.

Cuestiones relacionadas