2011-05-13 7 views
5

De acuerdo con el documento python, las barras verticales literal se utilizan como operador 'o'. Concuerda con A | B, donde A y B pueden ser RE arbitrarios.¿Cómo las barras verticales literal determinan la expresión regular formal en python?

Por ejemplo, si la expresión regular es el siguiente: ABC | DEF, que coincide con cadenas como éstas:

"ABC", "def"

pero lo que si quiero coincidir con cadenas como siguiente:

"ABCF", "ADEF"

Tal vez lo que quiero es algo así como A (BC) | (DE) F que significa:

  • partido "A" en primer lugar, a continuación,
  • cadena "AC" o "DE",
  • chamuscar "F".

Sé que la expresión anterior no es correcta ya que los corchetes tienen otros significados en la expresión regular, solo para expresar mi idea.

Gracias!

Respuesta

7

Estos funcionan:

A(BC|DE)F 
A(?:BC|DE)F 

La diferencia es el número de grupos de creación: 1 con la primera, 0 con el segundo.

suyo corresponde a ninguno de ABC o DEF, con 2 grupos, uno que no contiene nada y el otro que contiene el fragmento de emparejado (BC o DE).

+0

: Usted está equivocado. Lo he probado –

+0

Tienes razón. Estaba usando re.search, y fue exitoso, pero coincidí solo con una subcadena de 'ABCF' o' ADEF' (que probablemente no era la intención del OP). – ThomasH

+0

Lo interesante (que no conocía) es que '|' en 'A (BC) | (DE) F' en realidad tiene argumentos' A (BC) 'y' (DE) F', no solo '(BC) 'y' (DE) '. – ThomasH

3

La única diferencia entre paréntesis en expresiones regulares de Python (y expresiones regulares compatibles con Perl en general), y paréntesis en expresiones regulares formales, es que en Python, los parientes almacenan sus resultados. Todo lo que coincide con una expresión regular entre paréntesis se almacena como un "subcompañero" o "grupo" al que puede acceder utilizando el método group en el objeto coincidente devuelto por re.match, re.search o re.finditer. También se utilizan en las referencias posteriores, una característica de Python RE/PCRE que infringe las reglas normales de expresión regular y que probablemente no le interesan.

Si no te importa todo el trato de extracción de subcompactos, está bien usar parens así. Si le importa, existe una versión no capturable de parens que son exactamente las mismas que las expresiones regulares formales: (?:...) en lugar de (...).

Esto, y más, se describe en la @ThomasH official docs

Cuestiones relacionadas