• Publicidad

Expresiones Regulares en Variables

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Expresiones Regulares en Variables

Notapor Katty » 2006-08-30 17:35 @774

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:
Katty
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2006-08-30 17:11 @757

Publicidad

Notapor kidd » 2006-08-30 17:54 @787

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
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor creating021 » 2006-08-30 17:55 @788

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.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2006-08-30 18:18 @804

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.002 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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Gracias

Notapor Katty » 2006-08-31 14:16 @636

Muchas gracias a todos lo que me han ayudado... :lol:
Katty
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2006-08-30 17:11 @757


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado