Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Expresiones Regulares en Variables

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Mie Ago 30, 2006 4:35 pm
Katty
Perlero Nuevo
Perlero Nuevo
Registrado: 30 Ago 2006
Mensajes: 16
Expresiones Regulares en Variables Responder citando

Hola a todos:

Mi nombre es Katty y tengo el siguiente problema:

Tengo algunos patrones (como ADEN o ADENO o CARCIN o CARCINO o OMA, y muchos mas) los cuales debo encontrar y separar entre si.

Por ejemplo: si se ingresa la palabra ADENOCARCINOMA, la salida deberia ser: ADENO CARCIN OMA.

Mis pregunta son:

1.- Se pueden asociar a una sola variable los patrones para luego comapar... Yo lo he intentado y no se genera el resultado esperado Sad

2.- Como se pueden dar cuenta, cuando encuentra CARCIN tambien puede encontrar CARCINO, sin embargo la ultima O pertenece al otro patron OMA. Como puedo indicar que patron debe usar, o como le digo que en ciertas ocasiones devuelva el ultimo caracter sin que se confunda para otras entradas???

Espero que me puedan ayudar...

Wink
Mensaje Mie Ago 30, 2006 4:54 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Hola Katty:

Antes que nada bienvenida al foro Wink

Hay un par de tutoriales en el sitio que hablan acerca de expresiones regulares y que te podrían ayudar para darte una base más sólida:
http://perlenespanol.baboonsoftware.com/tutoriales/

Ahora, sería bueno que pongas el código que estás usando en este momento, para que a partir de ahí te ayudemos a encontrar la solución.


Saludos
Mensaje Mie Ago 30, 2006 4:55 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Eso me suena a IA, creo que una red neuranal aría el tebajo, o hay un módulo en CPAN que hace algo que te puede ayudar:
La red neuronal tomaría un poco de tiempo en que aprendiera a separar, el otro módulo es muy paresido a prolog, pero creo que la solucion más rápida es separar cada informacion por dos puntos ":" y "sacarlo" usando split.
La forma mas exacta es usar un separador como ya dije (":") y con split haces el trabajo.
Te doy otra forma:
Puedes hacer un algoritmo que escane un grupo de plabras como "ADEN" y que saque la palabra que sigue (por medio de substr) y dependiendo de el caso (Si sigue "O" y de esta otra palabra) decidis que hacer.
Por ejemplo si tenes CARSINOMA, el algoritmo encuentra CARSIN y coje la O, luego la M y ya sabe que es CARSIN y OMA.
Espero que te ayude.
Mensaje Mie Ago 30, 2006 5:18 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4225
Ubicación: Valladolid, España
Responder citando

Con las expresiones regulares se pueden sacar fácilmente los patrones, siempre y cuando sepamos las reglas en las que se basan.

Un ejemplo para lo que propones:
Perl:
#!/usr/bin/perl
use warnings;
use strict;

my @patrones = (
    'ADENO?(?!MA)'  ,
    'CARCINO?(?!MA)',
    'OMA'           ,
);

my $malestar = $ARGV[0] || 'ADENOCARCINOMA';

my @encontrado;
foreach my $patron ( @patrones ) {
    if ( $malestar =~ /($patron)/ ) {
        push @encontrado, $1;
    }
}

print join(" ", @encontrado);
print "\n";

Probando:
Código:
explorer@casa:~/> ./vade.pl ADENOCARCINO
ADENO CARCINO
explorer@casa:~/> ./vade.pl ADENOCARCIN
ADENO CARCIN
explorer@casa:~/> ./vade.pl ADENCARCINOMA
ADEN CARCIN OMA
explorer@casa:~/> ./vade.pl ADENOCARCINOMA
ADENO CARCIN OMA
explorer@casa:~/> ./vade.pl ADENOMA
ADEN OMA


En este ejemplo hacemos uso de las expresiones regulares extendidas.
Lo que hace el programa es lo siguiente:
  • Creamos un array llamados @patrones en donde guardaremos las expresiones regulares que queremos extraer. En este caso, hemos supuesto que no importa el orden en que vamos a sacar la información.
  • Luego leemos el $malestar desde la entrada estándar, como argumento, o le damos uno de prueba.
  • Hacemos luego un bucle por todos los @patrones:
    • Si dentro de $malestar hay un $patron, entonces, por efecto de los paréntesis, queda guardado en $1.
    • y lo guardamos en @encontrado.

  • Al final, pintamos el resultado.

El truco está en las expresiones regulares. La expresión CARCINO?(?!MA) quiere decir: "Busca la palabra CARCIN, opcionalmente seguida de O (O?), PERO que no esté seguida de MA ((?!MA))"

Naturalmente, la solución es sencilla porque has puesto un ejemplo sencillo. Como dice kidd, sería interesante ver todo el problema.
Mensaje Jue Ago 31, 2006 1:16 pm
Katty
Perlero Nuevo
Perlero Nuevo
Registrado: 30 Ago 2006
Mensajes: 16
Gracias Responder citando

Muchas gracias a todos lo que me han ayudado... Laughing
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group