2011-07-10 16 views
10

supe que [] denota un conjunto de caracteres permitidos -diferencia b/w [ab] y (a | b) en la coincidencia de expresiones regulares?

>>> p = r'^[ab]$' 
>>> 
>>> re.search(p, '') 
>>> re.search(p, 'a') 
<_sre.SRE_Match object at 0x1004823d8> 
>>> re.search(p, 'b') 
<_sre.SRE_Match object at 0x100482370> 
>>> re.search(p, 'ab') 
>>> re.search(p, 'ba') 

Pero ... hoy me encontré con una expresión con barras verticales dentro de paréntesis para definir patrones mutuamente excluyentes -

>>> q = r'^(a|b)$' 
>>> 
>>> re.search(q, '') 
>>> re.search(q, 'a') 
<_sre.SRE_Match object at 0x100498dc8> 
>>> re.search(q, 'b') 
<_sre.SRE_Match object at 0x100498e40> 
>>> re.search(q, 'ab') 
>>> re.search(q, 'ba') 

Esto parece imitar la misma funcionalidad que la anterior, ¿o me falta algo?

PD: En el Python, los paréntesis mismos se usan para definir grupos lógicos de texto coincidente. Si utilizo la segunda técnica, ¿cómo uso paréntesis para ambos trabajos?

+0

No estoy seguro de lo que quiere decir con el bit paréntesis ... –

+1

Sí, estás en lo correcto - '[ab]' y '(una | b) 'ambos coinciden _exactamente_ lo mismo (pero el primero coincidirá más rápido). Las expresiones regulares son un lenguaje en sí mismas (ya sea que las encuentres en Python o Perl) y necesitas aprender su sintaxis (críptica) si planeas usarlas efectivamente. (Por ejemplo, paréntesis dentro de una expresión regular no son lo mismo que paréntesis fuera de la expresión regular). Recomiendo seguir el tutorial en [regular-expressions.info] (http://www.regular-expressions.info). Cualquier tiempo pasado allí será recompensado muchas veces. – ridgerunner

Respuesta

16

En este caso, es lo mismo.

Sin embargo, la alternancia no se limita a un solo carácter. Por ejemplo,

^(hello|world)$ 

coincidirá con "hola" o "mundo" (y sólo estas dos entradas), mientras que

^[helloworld]$ 

acaba de coincidir con un solo carácter ("h" o "w" o "d" o lo que sea).

Happy coding.

13

[ab] coincide con un caracter (ao b) y no captura el grupo. (a|b) captura aob, y lo combina. En este caso, no hay gran diferencia, pero en los casos más complejos [] sólo puede contener caracteres y clases de personajes, mientras que (|) pueden contener arbitrariamente complejas de expresiones regulares a ambos lados de la tubería

3

En el ejemplo que diste son intercambiables. Hay algunas diferencias dignas de mención:

En la clase de caracteres entre corchetes que no tiene que escapar nada más que un guión o corchetes, o el acento circunflejo^

(pero sólo si es el primer carácter.)

Los paréntesis capturan las coincidencias para que pueda consultarlas más adelante. Las coincidencias de clases de caracteres no hacen eso.

puede hacer coincidir cadenas de caracteres múltiples en paréntesis, pero no en las clases de caracteres

Cuestiones relacionadas