Expr. regulares

Chema Cortes py en ch3m4.org
Mie Feb 22 20:18:41 CET 2006


Catalin Lungu escribió:
> Hola Chema,
> Si me podrías explicarme un poco la expresión. He visto algo de
> documentación pero no acabo de aclararme.
> 
> "^(\+|-|)\d{0,3}(\.\d{3})*,{0,1}\d*$"
> 
> ^(\+|-|)  --- esto excluye los + y - ???

Nope. El símbolo ^ tiene dos significados:

- Indica principio de línea (el símbolo final de línea es el $ )
- Si está el primero dentro de un conjunto (entre corchetes [ ] ) indica
exclusión.

En éste caso indica principio de línea.

Los paréntesis sirven para agrupar, lo que con el símbolo | nos permite
crear opciones, al estilo OR de las expresiones lógicas.

En concreto (\+|-|) se podría traducir (en pseudocódigo) como:

simbolo(+) or simbolo(-) or None


Un número se identifica como que empieza por +/- o por nada.


> \d{0,3} --- se supone que admite 3 dìgitos de 0 a 9

Sí. lo que hay entre paréntesis califica a lo que hay delante (símbolo o
grupo) indicando la cantidad mínima y máxima de repeticiones que puede
tener:

\d{0,3}  de cero a tres dígitos seguidos


En general

\d{n,m}  entre n y m veces
\d{n}    exáctamente de n veces
\d{,m}	 entre 0 y m
\d{n,}   entre n e infinito

Lo siguiente sería equivalente:

\d*  ==  \d{0,}
\d+  ==  \d{1,}
\d?  ==  \d{0,1}

Ojo, el símbolo ? puede tener más significados. Uno de los más curioso
es el de no-codicioso (non-greedy), que significa que entre varias
opciones coja la que menos repeticiones tenga (por defecto siempre coge
la que mayor repeticiones le dé).

Por ejemplo,  \d{n,m}?  indica la "menor repetión de dígitos que se
encuentre entre n y m veces"

Así mismo (?...) no es un grupo, si no que indica opciones de control
sobre el modo de buscar patrones y que también permite crear grupos. Es
muy complejo para explicarlo ahora.


> (\.\d{3})* --- esto admite varios grupos de 3 dígitos de 0 a 9

El grupo es un punto \. seguido de 3 dígitos, y este grupo puede
repetirse de 0 a infinito.


> ,{0,1}\d*$" --- esto no lo entiendo

Lo primero es una coma (no tiene otro significado) que se repite una o
ninguna vez, seguido de números y llegando al final de la línea (símbolo $)



> Es que les veo mucha utilidad, pero a la primera vista parecen imposibles.
> Para detectar tipos double de tamaño variable con separador de decimales
> punto o coma y que solo el signo menos esté en la primera posición como
> debería hacerlo?
> 
> Así?
> "-?\d\*.\d*"


El punto tiene un significado de "cualquier cosa". Debes escaparlo. Creo
que te han bailado el "escape" :-P

Corregido sería: "-?\d*\.\d*"

Funcionaría bien, pero dices que la coma decimal puede ser coma ó punto.
Por tanto lo ponemos como un conjunto así:

"-?\d*[\.,]\d*"

El fallo de ésto es que puede darnos falsos positivos en el caso de que
sea: -.  (o sea, no hay ningún dígito ni a la izquierda ni a la derecha)


No tengo tiempo ahora, pero la idea pasaría por crear grupos e intentar
buscar hacia delante. Ya te lo explico en otro mensaje.




Más información sobre la lista de distribución Python-es