Página 1 de 1

Expresiones Regulares en Variables

NotaPublicado: 2006-08-30 17:35 @774
por Katty
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 :(

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:

NotaPublicado: 2006-08-30 17:54 @787
por kidd
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.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

NotaPublicado: 2006-08-30 17:55 @788
por creating021
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.

NotaPublicado: 2006-08-30 18:18 @804
por explorer
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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Probando:
Código: Seleccionar todo
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.

Gracias

NotaPublicado: 2006-08-31 14:16 @636
por Katty
Muchas gracias a todos lo que me han ayudado... :lol: