Página 1 de 1

Problema: Registro de coincidencia y no coincidencia (regex)

NotaPublicado: 2015-09-28 01:00 @083
por pubafra
Hola, comunidad de perlenespanol. Necesito de su ayuda para resolver un pequeño problemita.

Espero explicarme bien y que puedan entender así como lo describo.

Les platico: Tengo la siguiente lista (inventado para ejemplificar):
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AAAA
TTTT
GGGG
CCCC
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

son las secuencias que quiero buscar en una biblioteca, esta (inventada para ejemplificar):
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
XXXXXXXXX
NNNNNXXXX
TTTTXXXXX
NNNNXXXXX
GGGGXXXXX
XXXXXXXXX
AAAAXXXXX
TTTTXXXXX
CCCCXXXXX
AAAAXXXXX
AAAAXXXXX
TTTTXXXXX
AAAAXXXXX
CCCCXXXXX
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

usando un script que explorer me ayudó a hacer puedo obtener lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
AAAA    4 #la primer palabra de lista aparece 4 veces en biblioteca
TTTT    3 #la segunda palabra de lista aparece 3 veces en biblioteca
GGGG    1 #la tercer palabra de lista aparece 1 veces en biblioteca
CCCC    2 #la cuarta palabra de lista aparece 2 veces en biblioteca
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

lo que yo quiero hacer es obtener las secuencias de la biblioteca que no tuvieron coincidencia con la lista.

Para este ejemplo sería un resultado como este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
XXXXXXXXX
NNNNNXXXX
NNNNXXXXX
XXXXXXXXX
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

He intentado varias opciones logrando obtener solo las secuencias que coinciden:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
TTTTXXXXX
GGGGXXXXX
AAAAXXXXX
TTTTXXXXX
CCCCXXXXX
AAAAXXXXX
AAAAXXXXX
TTTTXXXXX
AAAAXXXXX
CCCCXXXXX
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

pero estoy interesado en ambos resultados (las secuencias de la biblioteca que coinciden y las que no coinciden).

Espero de su ayuda u orientación con soluciones similares o funciones que puedan ayudar a resolverlo. Gracias y saludos.

Re: Problema: Registro de coincidencia y no coincidencia (re

NotaPublicado: 2015-09-28 15:58 @707
por explorer
Solo es necesario incluir una excepción, para el caso de que no exista coincidencia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. # Leemos las secuencias
  6. open my $SECUENCIAS, '<', 'secuencias.txt';
  7. my @secuencias = <$SECUENCIAS>;
  8. chomp @secuencias;
  9. close $SECUENCIAS;
  10.  
  11. # Construimos la exp. reg.
  12. my $regex = join '|', @secuencias;
  13. $regex = qr/($regex)/;
  14.  
  15. # Recorrer el archivo de bibliotecas
  16. my %contador;
  17. my @no_coincide;
  18. open my $BIBLIOTECA, '<', 'bibliotecas.txt';
  19. while (my $linea = <$BIBLIOTECA>) {
  20.     chomp $linea;
  21.  
  22.     my $ha_coincidido;
  23.     while($linea =~ /$regex/g) {
  24.         $contador{$1}++;
  25.         pos($linea) = $-[0] +1;         # apuntamos a la posición inicial, siguiente, de la última coincidencia
  26.         $ha_coincidido = 1;
  27.     }
  28.  
  29.     if (not $ha_coincidido) {
  30.         push @no_coincide, $linea;
  31.     }
  32. }
  33. close $BIBLIOTECA;
  34.  
  35. # Mostrar resultados
  36. open my $SALIDA,     '>', 'resultado.txt';
  37. while (my($secuencia,$veces) = each %contador) {
  38.     say $SALIDA "$secuencia $veces";
  39. }
  40. close $SALIDA;
  41.  
  42. open my $SALIDA_NO,  '>', 'resultado_no.txt';
  43. for my $no_coincide (@no_coincide) {
  44.     say $SALIDA_NO $no_coincide;
  45. }
  46. close $SALIDA_NO;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Con el uso de la bandera $ha_coincidido se puede saber si la secuencia ha coincidido o no, por lo que podemos guardarla en el array @no_coincide, que sacaremos al final.

Re: Problema: Registro de coincidencia y no coincidencia (re

NotaPublicado: 2015-10-02 21:17 @928
por pubafra
explorer: de nuevo muchas gracias. Una disculpa por no haber agradecido antes.

Agregar la excepción estuvo muy bien, probé el script con una lista de 350 secuencias a buscar en una biblioteca que tiene 65533 secuencias.

El resultado debería esperar por supuesto:
archivo coincidencia ## (las secuencias que coinciden con las secuencias de la lista),
archivo no coincidencia ## (las secuencias que no coinciden con las secuencias de la lista).

El número de secuencias coincidencia más el número de secuencias no coincidencia deberían sumar los 65533 (coincidencia + no coincidencia = total biblioteca). Sin embargo no consigo obtener ese valor.

Para un caso particular obtengo la suma de 65580.

Lo sé, no es mucha la diferencia pero ya he revisado los archivo y corrí más de una vez el script ¿a qué crees que se deba esta diferencia (65580 - 65533 = 47)?

Por último, lo he probado con archivos con menos secuencias y no existe diferencias de la suma y el total de secuencias.

Saludos y gracias.

Re: Problema: Registro de coincidencia y no coincidencia (re

NotaPublicado: 2015-10-03 05:57 @290
por explorer
Pues que hay "algo" en esas 47 secuencias que hacen que no salgan impresas.

Sería interesante localizar alguna, para ver el aspecto que tiene.

Si el programa no las ha detectado, es quizás por falta de robustez (el programa no ha sabido responder a casos extremos -líneas vacías, por ejemplo-) o se ha encontrado con algo que no esperaba (metacaracteres en las secuencias de búsqueda que alteran la formación de la expresión regular).