Foros del Web » Programando para Internet » Python »

Expresiones regulares: Sólo números y espacios o saltos de linea

Estas en el tema de Expresiones regulares: Sólo números y espacios o saltos de linea en el foro de Python en Foros del Web. Hola, No ando muy puesto en expresiones regulares y quisiera saber como se hace lo siguiente en python: Checkear que una cadena sólo contenga números ...
  #1 (permalink)  
Antiguo 14/06/2011, 01:57
 
Fecha de Ingreso: abril-2008
Mensajes: 56
Antigüedad: 16 años
Puntos: 1
Expresiones regulares: Sólo números y espacios o saltos de linea

Hola,

No ando muy puesto en expresiones regulares y quisiera saber como se hace lo siguiente en python:

Checkear que una cadena sólo contenga números (enteros Y/o flotantes) y espacios, normalmente para separar los numeros aunque tb pueden ir al principio o final.


Gracias de antemano
  #2 (permalink)  
Antiguo 14/06/2011, 07:53
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Expresiones regulares: Sólo números y espacios o saltos de linea

Puedes usar expresiones regulares, pero también puede que no.

Por ejemplo puedes usar strip para quitar los espacios que sobren adelante y atrás, seguido de un split para obtener una lista de números. entonces por cada numero checas si es entero, flotante o ninguno de los 2 usando las funciones int y float.

Este algoritmo sería el mismo usando expresiones regulares, solo sustituye las funciones int y float para tus expresiones regulares.

Expresión regular para enteros:
Código:
[+-]?\d+
Expresión regular para flotantes:
Código:
[+-]?\d+(\.\d+|[eE][+-]?\d+)?

Última edición por razpeitia; 14/06/2011 a las 11:09
  #3 (permalink)  
Antiguo 14/06/2011, 10:01
 
Fecha de Ingreso: abril-2008
Mensajes: 56
Antigüedad: 16 años
Puntos: 1
Respuesta: Expresiones regulares: Sólo números y espacios o saltos de linea

Muchas gracias, lo de usar expersiones regulares es por que creo que es más limpio, además de que me gustaría testear toda la cadena de una sola vez en vez de ir elemento a elemento.

¿Como podría juntar las dos expresiones regulares para que compruebe si la cadena contiene enteros y/o flotantes? Es decir:

Para una cadena " 8 7 9.3 4.2 7 6" que con una sola expresión me salga verdadera, en vez de comprobar elemento a elemento si es entero o flotante
  #4 (permalink)  
Antiguo 14/06/2011, 11:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Expresiones regulares: Sólo números y espacios o saltos de linea

De hecho usar expresiones regulares se deja como ultimo recurso y solo se usa si lo que quieres son validaciones simples.

Si quieres validar que solo sean números y después los vas a convertir a números entonces estas haciendo trabajo de mas.

Puedes darte cuenta que la segunda expresión regular admite enteros y flotantes.
Código:
[+-]?\d+(\.\d+)?
  #5 (permalink)  
Antiguo 14/06/2011, 11:26
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Expresiones regulares: Sólo números y espacios o saltos de linea

El mejor método, el más "limpio", es el que entiendas. De nada te sirve usar una expresión regular que te valide la cadena pero que luego, si querés modificar, no sepas cómo.
Tu prioridad debería ser que funcione; y solamente si luego funciona lento, optimizarlo.

La respuesta a tu pregunta es algo como esto:

Código:
([+-]?\d+(\.\d+)?([Ee]\d+)? ?)+
Que no sé si funciona correctamente, pero sigue la idea aunque no es muy legible. Nota que la expresión que te dio razpeitia no es correcta en todos los casos porque daría como correcta a "1." y a "1e05" (que es un flotante válido aunque no tenga decimales), mientras que no daría como correcta a "1.5e19"

El problema son las partes opcionales. Al validar enteros mezclados con flotantes, tienes dos partes opcionales: la parte decimal y la parte exponencial. Esto lleva a que haya 4 posibilidades:
entero => 1
flotante sin exponente => 1.5
flotante sin decimales => 1E05
flotante con decimales y con exponente => 1.5E05

Además, si querés validar toda la cadena de una vez, tendrás que tener en cuenta que el patrón se repite, separado por un espacio (o no, quizás la parte final no tenga espacio)

Saludos.

Etiquetas: espacios, expresiones, linea, regulares, saltos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:17.