• Publicidad

Expresión regular de comparación con letra comodín

Perl aplicado a la bioinformática

Expresión regular de comparación con letra comodín

Notapor slopal » 2006-04-26 12:26 @560

Dentro de mi programa tenía un if() con la siguiente expresión:

if( $var1 eq $var2) { .... }

$var1 y $var2 sólo podían contener 'A', 'T', 'C' o 'G'. O sea, que así perfecto...

Pero ahora he tenido que introducir un cambio: una de las dos variables, por ejemplo $var1 puede contener caracteres comodín, representados por la letra 'N'. Esto significa que si en $var1 encuentro una 'N', siempre tendría que dar cierto (en ese carácter).

No sé si me explico. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$var1  eq  $var2   Resultado:
AT            AT   Cierto
AN            AA   Cierto
ANNT        ATCT   Cierto
ANNT        AAAT   Cierto
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

¿Cómo podría crear la expresión regular que chequee esto? ¿Hay alguna forma de poner un comodín?

Supongo que tendrá que ser del tipo:

if($var2 =~ m/^ ??$var1???$/) { .... }

Tampoco sé cómo incluirlo dentro de un if() :$

Gracias
:oops:
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Publicidad

Notapor explorer » 2006-04-26 12:48 @575

Se puede convertir la primera variable en una expresión regular y luego hacer la comparación:
Código: Seleccionar todo
$var1 =~ s/N/[ATCG]/g;

if ( $var2 =~ m/^$var1$/ ) { print "Coincidencia..." }
Quedaría mejor salvaguardando la variable original:
Código: Seleccionar todo
($expreg = $var1) =~ s/N/[ATCG]/g;

if ( $var2 =~ m/^$expreg$/ ) { print "Coincidencia..." }
Incluso hasta se puede crear una variable que sea realmente toda la expresión regular que estamos buscando:
Código: Seleccionar todo
($expreg = $var1) =~ s/N/[ATCG]/g;
$expreg = qr(^$expreg$);
if ( $var2 =~ $expreg ) { print "Coincidencia..." }
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor slopal » 2006-04-26 13:42 @612

¡¡Que curioso!!

Lo que no se si me he explicado bien. Quiero que sean exactas las dos variables.

He probado con:
perl -le '$var1= /'ANNNT/'; $var2= /'ATCGA/'; $var1 =~ s/N/[ATCG]/g; if($var2 =~ /^$var1$/){print"coincidenciaaaaaa"}'
coincidenciaaaaaa
¡y me lo da por bueno! ¿Cómo podría restringirlo?

¡MIL gracias!
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Notapor explorer » 2006-04-26 13:45 @614

Código: Seleccionar todo
perl -le '$var1= "ANNNT"; $var2= "ATCGA"; $var1 =~ s/N/[ATCG]/g; if($var2 =~ /^$var1$/){print"coincidenciaaaaaa"}'

Habías escrito las variables con unas cuantas comillas extra, no como cadenas de caracteres :)

A veces es un lío si manejas unix y windows. En unix tienes que meter todo el script entre comillas simples ('), mientras que en windows es al revés.
Última edición por explorer el 2006-04-26 13:51 @619, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor slopal » 2006-04-26 13:49 @617

explorer escribiste:
Código: Seleccionar todo
perl -le '$var1= "ANNNT"; $var2= "ATCGA"; $var1 =~ s/N/[ATCG]/g; if($var2 =~ /^$var1$/){print"coincidenciaaaaaa"}'


VALE... sin las /... ya decia yo :P
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Notapor slopal » 2006-05-02 12:46 @574

respecto al mismo tema...
necesito una manera RÁPIDA de hacer esto:

tengo una @lista = .... (que puede contener A, T, C, G y N (donde N es un comodín)).

quiero transformarlo en un hash? con las posibles listas generadas (sustituyendo la N por [ATCG]).

Me imagino una forma pero muy larga, transformandolo en $variable, haciendo joins.. luego otra vez a lista... :S
nose :S alguna idea?

(Ejemplo:

@lista = AN;

**procesamiento**

%hash = (AA, AC, AG, AT);

(AA es una lista (no una variable escalar), AC otra, AG otra...)
slopal
Perlero nuevo
Perlero nuevo
 
Mensajes: 78
Registrado: 2005-11-23 11:41 @528

Notapor Perl user » 2006-05-02 16:14 @718

slopal escribiste:respecto al mismo tema...
necesito una manera RÁPIDA de hacer esto:

tengo una @lista = .... (que puede contener A, T, C, G y N (donde N es un comodín)).

quiero transformarlo en un hash? con las posibles listas generadas (sustituyendo la N por [ATCG]).

Me imagino una forma pero muy larga, transformandolo en $variable, haciendo joins.. luego otra vez a lista... :S
nose :S alguna idea?

(Ejemplo:

@lista = AN;

**procesamiento**

%hash = (AA, AC, AG, AT);

(AA es una lista (no una variable escalar), AC otra, AG otra...)


Que tal, no entendí la pregunta, podrías profundizar mas en ella y agregar algún ejemplo de lo que quieres realizar?

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor creating021 » 2006-05-02 17:00 @750

necesito una manera RÁPIDA de hacer esto:

tengo una @lista = .... (que puede contener A, T, C, G y N (donde N es un comodín)).

quiero transformarlo en un hash? con las posibles listas generadas (sustituyendo la N por [ATCG]).

Solitario he?
Bueno, creo que seria algo como esto -->
Código: Seleccionar todo
my @lista = qw(A B C D);
my @contenido = (1, 2, 3, 4);
my %hash;
my $i = 0;
foreach my $letra (@lista){
  $hash{"$letra"} = $contenido[$i++];
}

Bueno, el problema es que el hash tenga mas de una equivalencia ( $hash{"Hola"} = ["Hello", "Chiao"];)
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 Perl user » 2006-05-02 17:24 @766

creating021 escribiste:
necesito una manera RÁPIDA de hacer esto:

tengo una @lista = .... (que puede contener A, T, C, G y N (donde N es un comodín)).

quiero transformarlo en un hash? con las posibles listas generadas (sustituyendo la N por [ATCG]).

Solitario he?
Bueno, creo que seria algo como esto -->
Código: Seleccionar todo
my @lista = qw(A B C D);
my @contenido = (1, 2, 3, 4);
my %hash;
my $i = 0;
foreach my $letra (@lista){
  $hash{"$letra"} = $contenido[$i++];
}

Bueno, el problema es que el hash tenga mas de una equivalencia ( $hash{"Hola"} = ["Hello", "Chiao"];)


No sé si eso era lo que preguntaban, pero si lo es, entonces tu solución no es la mas adecuada, pero no deja de ser una solución.

Te planteo una solución usando un hash slice.

Código: Seleccionar todo
my @lista = qw(A B C D);
my @contenido = (1, 2, 3, 4);
my %hash;
@hash{@lista} = @contenido;


Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor explorer » 2006-05-03 05:21 @264

A ver... yo creo que lo que quieres es recrear todas las combinaciones que aparezca la N...
El problema es sencillo si sólo aparece una vez la N en cada lista, pero complicado si aparece más de una vez.
Si ese es el caso, el que pueda aparecer más de una vez la N, estamos ante un problema de combinatoria.
Última edición por explorer el 2006-05-03 14:53 @662, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron