Perl en Español

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

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

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Mie Abr 26, 2006 11:26 am
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Expresión Regular de comparación con letra comodín Responder citando

Dentro de mi programa tenía un if con la siguiente expresión:
Código:
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 caracter).

No sé si me explico. Por ejemplo:
Código:
$var1  eq  $var2   Resultado:
AT            AT   Cierto
AN            AA   Cierto
ANNT        ATCT   Cierto
ANNT        AAAT   Cierto

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

Supongo que tendrá que ser del tipo:
Código:
if($var2 =~ m/^ ??$var1???$/) { ....  }
Tampoco se cómo incluirlo dentro de un if :$

Gracias
Embarassed
Mensaje Mie Abr 26, 2006 11:48 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

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

if ( $var2 =~ m/^$var1$/ ) { print "Coincidencia..." }
Quedaría mejor salvaguardando la variable original:
Código:
($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:
($expreg = $var1) =~ s/N/[ATCG]/g;
$expreg = qr(^$expreg$);
if ( $var2 =~ $expreg ) { print "Coincidencia..." }
Mensaje Mie Abr 26, 2006 12:42 pm
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

¡¡Que curioso!!

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

He probado con:
Cita:
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!
Mensaje Mie Abr 26, 2006 12:45 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Código:
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 Smile

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.

Ultima edición por explorer el Mie Abr 26, 2006 12:51 pm, editado 1 vez
Mensaje Mie Abr 26, 2006 12:49 pm
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

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


VALE... sin las /... ya decia yo Razz
Mensaje Mar May 02, 2006 11:46 am
slopal
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Nov 2005
Mensajes: 78
Responder citando

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...)
Mensaje Mar May 02, 2006 3:14 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Responder citando

slopal escribió:
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,
Mensaje Mar May 02, 2006 4:00 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
Responder citando

Cita:
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:

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"]Wink
Mensaje Mar May 02, 2006 4:24 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Responder citando

creating021 escribió:
Cita:
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:

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"]Wink


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:

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


Saludos,
Mensaje Mie May 03, 2006 4:21 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

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.

Ultima edición por explorer el Mie May 03, 2006 1:53 pm, editado 1 vez
Mensaje Mie May 03, 2006 1:10 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

A ver con esto...
Código:
#!/usr/bin/perl -l
use warnings;
use strict;

my %almacen;
my @almacen;
my @bases = qw( A T C G );
my @lista = qw( AN ACGNGTCNACGCGT );

foreach my $secuencia ( @lista ) {
   print "$secuencia<=";
   expande_secuencia( "", $secuencia );
}

sub expande_secuencia {
   # Dada dos partes de la secuencia,
   # La primera no contiene ninguna N.
   # Si la segunda no contiene N, la pintamos.
   # Si sí tiene, divide la segunda en partes, combina y repite.
   my ( $primera, $segunda ) = @_;
   if ( $segunda =~ /N/ ) {
      my ($media, $resto) = split('N',$segunda,2);
      foreach my $base ( @bases ) {
         expande_secuencia( $primera . $media . $base, $resto);
      }
   } else {
      my $secuencia = "$primera$segunda";
      print $secuencia;          # Sacarlo a pantalla
      $almacen{$secuencia} = 1;  # Guardarlo en un hash
      push @almacen, $secuencia; # Guardarlo en un array
   }
}
Salida:
Código:
AN<=
AA
AT
AC
AG
ACGNGTCNACGCGT<=
ACGAGTCAACGCGT
ACGAGTCTACGCGT
ACGAGTCCACGCGT
ACGAGTCGACGCGT
ACGTGTCAACGCGT
ACGTGTCTACGCGT
ACGTGTCCACGCGT
ACGTGTCGACGCGT
ACGCGTCAACGCGT
ACGCGTCTACGCGT
ACGCGTCCACGCGT
ACGCGTCGACGCGT
ACGGGTCAACGCGT
ACGGGTCTACGCGT
ACGGGTCCACGCGT
ACGGGTCGACGCGT

Lo que no entiendo es porqué quieres guardarlo como hash. Parece que es un array lo que quieres obtener.
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