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