Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Expresiones Regulares.
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Expresiones Regulares. 
 
Hola!.

Después de acabar la aplicación en Python quiero hacerla en gambas. Pero me encuentro problemas con la discrepancia entre
las expresiones regulares que uso en Python y como las entiende el componente gb.pcre. Muchas funcionan bien, pero otras no.
¿ No deberían ser estas cosas estándar para todos los lenguajes ? ( Si es que no nos ponemos de acuerdo y luego quieren estandars!).

Os voy a mostrar ejemplos, no es el programa que he hecho.
Os cuento lo que quiero hacer aquí:

1º Extraer el correo electrónico. Correcto
2º Extraer la hora del correo electrónico. No va bien
3º Extraer el domino del correo electrónico. Correcto.

Public Sub Main()
  
  Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "(\\S+@\\S+)")
  Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "^From.* ([0-9][0-9]):")
  Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "@([^ ]*)")
        
End

Public Function ResultadoER(cadena As String, expresion As String) As String
  
  Dim re As RegExp  
  
  re = New RegExp(cadena, expresion)
  If re.Count = 1 Then
    Return re.Text
  Else
    Return ("No devuelve resultado")
  Endif
  
End
 


Las salidas fueron estas:
Citar:


From Sat Jan 5 09:
@aqui.com


Como veis en el segundo intento extraer solo  la hora, pero los paréntesis que extraen la parte que nos interesa de la cadena, me toma desde el principio.
La idea es de, que toda linea que empieza por "From "me tome la hora del correo. Es que si no va me estar extrayendo cualquier cosa.  
Podía haber usado esto:

Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "([0-9][0-9]):")
 


Pero extraería de un archivo toda linea que contuviese un numero del 0-9, ídem y dos puntos

¿ Una ayudita para este pobre programador a jornada parcial ?. Jeje.

Saludos
 




===================
Gambas Básico
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
Uy que pegados estáis en expresiones regulares. Os habrá sonado a chino mandarín todo esos símbolos.

Expresiones regulares

¿ Os acordáis del comando grep de la consola ?. ( Pues lo mismo).

Me parece que vais a tener que ir a clase a aprender. La maestra tiene una mala ostia.

 maestra2

Menos mal que tengo una compañera de clase que me ayuda en "todo!.".

 alumna

Saludos!
 




===================
Gambas Básico
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
última edición por Shell el Domingo, 21 Diciembre 2014, 08:55; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
Shell:

Con el siguiente código si me sale:

Public Sub Form_Open()

  Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "(\\S+@\\S+)")
  Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "([0-9][0-9]):([0-9][0-9]):([0-9][0-9]) ")
  Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "@([^ ]*)")

End

Public Function ResultadoER(cadena As String, expresion As String) As String

  Dim re As RegExp

  re = New RegExp(cadena, expresion)
  If re.Count = 1 Then
    Return re.Text
  Else
    If re.count <> 0 Then
      Return re[0].text
    Else
      Return ("No devuelve resultado")
    Endif
  Endif

End


Obtengo:
Citar:
pepito.perez@aqui.com
09:14:16
@aqui.com


 expresiones_regulares
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
Julio:

Cachis. El ejercicio no era "extraer" la hora entera. Tan solo la parte de las horas. Esto no lo dije bien.

El problema realmente radica, "sin usar una condicional" ( es que toda linea que comience con "From" se extraiga la hora.(solo la hora, no minutos, ni segundos)
Pero ninguna linea más,solo las que comienzan con "From"  

Interesante la imagen de depuración. Tengo que probar a ver como lo haces. Nunca había visto eso.
Realmente para "la hora completa" debería haber sido de esta forma
Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "([0-9][0-9]:\\S+)")
 


Te devolvería esto:
Citar:

09:14:16


\\S  Coincide con cualquier carácter que no sea un espacio en blanco. (A la derecha y a la izquierda)
+  Repite un carácter 0 más veces.

Así que \\S+  repite la búsqueda de caracteres tanto para el lado izquierdo y derecho buscando caracteres y acaba cuando encuentra espacios. ( A los dos lados)

Lo que no sabía es lo de usar varios paréntesis para extraer, distintas partes.

No olvides que lo se pretende es hacerlo con cada linea que comience solo con "From" y solo la parte de la hora (sin minutos y segundos)
Visto lo de los paréntesis se puede buscar una solución con eso. Pero se me hace un poco raro. No estoy acostumbrado a verlo así.

Son complejas estas expresiones.

Saludos
 




===================
Gambas Básico
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
última edición por Shell el Domingo, 21 Diciembre 2014, 12:39; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
He hecho esto:

Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "^From.* (([0-9][0-9])):")  
 


Y de re[1] se obtiene la hora. Pero que rara es esta forma. ¿ Es así como se hace en gambas ?.  

Saludos
 




===================
Gambas Básico
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
Quedaría así:

Public Sub Main()  

  'Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "^From.* (([0-9][0-9])):")  
  Print ResultadoER("From pepito.perez@aqui.com Sat Jan 5 09:14:16 2008", "^From.* ([0-9][0-9]):")  
  
End

Public Function ResultadoER(cadena As String, expresion As String) As String
  
  Dim re As RegExp  
  Dim acojunto As New String[]
  
  re = New RegExp(cadena, expresion)
  If re.Count >= 1 Then
    Return re[1].Text        
  Else
    Return ("No devuelve resultado")
  Endif
  
End
 


¿ Alguna mejora ?.

Pues si, no son necesarios los dos paréntesis...:-)
Solo hay que devolver el índice 1 del resultado de la expresión.


Saludos
 




===================
Gambas Básico
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
última edición por Shell el Domingo, 21 Diciembre 2014, 14:31; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
Shell:

Citar:
¿ Es así como se hace en gambas ?

No creo que sea gambas, será cuestión de la expresión regular que introduzcas.

Seria interesante probar estas mismas expresiones en otros lenguajes (python, por ejemplo), y ver si devuelven lo mismo.


Saludos

Julio
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
Julio:

Mas que gambas, es el componente que usa este para poder hacer uso de las expresiones regulares.
gambas es el medio para que el componente funcione.

En Python solo uso esto:

"^From.* ([0-9][0-9]):"

Hay distintas formas de búsquedas ( es como lo hace), ejemplo  una que llaman "greedy", que toma toda la expresión completa.
Y la que no lo es (non greedy).  Si tuvieras un cadena que tiene muchas veces repetido ":" y usas el método greedy, se va a parar en la ultima.

Ejemplo:

'From:Using the :character'

Si usásemos esa búsqueda ( en Python)
"^F.+:"

(El punto coincide con cualquier carácter) . Entonces le dices que se repita con cualquier carácter con el uso del +

Podemos esperar a que nos mostrase solo "From:"....pero no es así. Nos muestra:
'From:Using the :'

Eso es greedy ( codicioso, ávido, goloso)

Ahora usemos un método no greedy:

"^F.+?:"

Obtenemos:

'From:'

En cuanto a ver como funciona en cada lenguaje es distinto como se escriben las expresiones.
Un ejemplo básico. Con el componente de gambas usamos "\\S" en Python es "\S"
Pero seguro que es distinto en otros lenguajes, Java, C.

Perl es el que ha puesto en funcionamiento las expresiones regulares. Aun así,  el componente que usamos en gambas,
no parece aceptar "del todo" las expresiones que se usan en Perl. También tiene sus variantes.

La cosa es que hemos estado viendo un poco las expresiones regulares en Python. Entonces ha sido breve. Ya que hay muchas letras y signos.
Pero mas o menos me comienzo a defender en ambos lenguajes haciendo uso de las expresiones regulares.

Observación: Existen lenguajes distintos, cada uno a su manera, pero lo que no entiendo es que llegamos a un extremo que no nos ponemos
de acuerdo en algunos aspectos comunes (ejemplo las expresiones regulares ) y hasta en eso, queremos ser distintos y tener una identidad propia.
Quizás buscamos la independencia de otros y no seguir una linea marcada. ( Para bien o para mal)

Saludos
 




===================
Gambas Básico
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
última edición por Shell el Domingo, 21 Diciembre 2014, 14:01; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
Os recomiendo esta página para probar, descubrir y aprender sobre regex:

http://www.regexr.com/

Yo hace tiempo que comenté el poder de las expresiones regulares para ciertas tareas en programación. gambas soporta creo que casi todo, pero hay que tener en cuenta que debemos escapar algunos símbolos para que funcionen, como las barras y las comillas simples, etc. El operador Like de gambas, también hace uso de regex, por lo que puede servir para hacer pruebas.

Existen también programas de escritorio que hacen lo mismo que la página web que os indico, sólo hay que buscar con synaptic.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Expresiones Regulares. 
 
Jesús:

Gracias por el enlace. Tiene que estar bien esta página.
En cuanto a las aplicaciones de escritorio. Primero las busqué en ingles, el gestor de software.
Y luego mediante Synaptic encontré a kiki

Lo cierto es que podía haber escrito directamente en español en el buscador de software..expresiones regulares
y aparecen referencias en español, entre ellas kiki.

Citar:

Un entorno libre para pruebas de expresiones regulares (ferret). Permite escribir expresiones regulares y las prueba contra un texto, dando una extensiva salida acerca de los resultados. Es útil para muchos propósitos:

- exploring and understanding the structure of match objects
generated by the re module, making Kiki a valuable tool for people
new to regexes.
- testing regexes on sample text before deploying them in code.
Kiki puede funcionar por si mismo o como extensión para el editor de Python Spe.


Saludos
 




===================
Gambas Básico
“Lo mejor de los booleanos es que si te equivocas estás a un solo bit de la solución correcta. Anónimo."
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Expresiones Regulares... Aprovechando Awk! santijav Shell Scripting 2 Viernes, 08 Julio 2011, 00:17 Ver último mensaje
jsbsan
No hay nuevos mensajes Pregunta Sobre Expresiones Regulares Regexp dquinter General 1 Jueves, 26 Abril 2012, 20:21 Ver último mensaje
shordi
No hay nuevos mensajes Expresiones Regulares Aleking General 6 Miercoles, 02 Julio 2014, 20:31 Ver último mensaje
jguardon
No hay nuevos mensajes Interesante Sitio Para Aprender Sobre Expr... tincho Shell Scripting 1 Miercoles, 18 Enero 2017, 10:20 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario