• Publicidad

Consulta expresiones regulares

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Consulta expresiones regulares

Notapor Sebastian N » 2011-02-23 01:01 @084

Hola amigos:

Quería consultarlos porque necesito traerme el párrafo de un artículo o al menos unas cuantas palabras de un texto cuando se cumple una condición.

Mi idea es si aparece la palabra "A" cerca de la palabra "B" (es decir separada por una diferencia de 0-20 palabras).

Me gustaría traerme todo el párrafo donde está eso.

Mi código es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  while ($texto =~ /(($str_corte)(\W+\w+){0,20}\W+($str_calle))/gi)
  2.  {
  3.   $tmp=$tmp . $1 . "\n";
  4.  }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


siendo $str_corte, diferentes sinónimos de eventos de corte y str_calle todas los posibles nombres de calles.

Desde ya, muchísimas gracias.

Saludos
Sebastian
Sebastian N
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2010-10-23 20:59 @916

Publicidad

Re: Consulta expresiones regulares

Notapor explorer » 2011-02-23 11:41 @529

Sí, yo creo que podría funcionar, pero habría que hacer pruebas.

Por ejemplo, la condición {0,20}, hay que vigilarla... Miremos el siguiente ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3.  
  4. use open ':locale';
  5.  
  6. # texto a analizar
  7. my $texto
  8.     = 'En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho '
  9.     . 'tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, '
  10.     . 'rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón '
  11.     . 'las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún '
  12.     . 'palomino de añadidura los domingos, consumían las tres partes de su hacienda. '
  13.     . 'El resto della concluían sayo de velarte, calzas de velludo para las fiestas '
  14.     . 'con sus pantuflos de lo mismo, los días de entre semana se honraba con su '
  15.     . 'vellori de lo más fino. Tenía en su casa una ama que pasaba de los cuarenta, y '
  16.     . 'una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que así '
  17.     . 'ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro hidalgo '
  18.     . 'con los cincuenta años, era de complexión recia, seco de carnes, enjuto de '
  19.     . 'rostro; gran madrugador y amigo de la caza. Quieren decir que tenía el '
  20.     . 'sobrenombre de Quijada o Quesada (que en esto hay alguna diferencia en los '
  21.     . 'autores que deste caso escriben), aunque por conjeturas verosímiles se deja '
  22.     . 'entender que se llama Quijana; pero esto importa poco a nuestro cuento; basta '
  23.     . 'que en la narración dél no se salga un punto de la verdad.'
  24.     ;
  25.  
  26. my @frases;
  27.  
  28. while ($texto =~ /\G (?<frase>.+? [.!?]) \s*/gx) {
  29.     my $frase = $+{'frase'};
  30.    
  31.     $frase =~ s/\W+/ /g;        # quitamos los caracteres ortográficos
  32.  
  33.     push @frases, $frase;
  34. }
  35.  
  36. # análisis
  37. my $str_1 = 'un';
  38. my $str_2 = 'de';
  39.  
  40. for my $frase (@frases) {
  41.     say "[$frase]\n";
  42.    
  43.     while ($frase =~ /(\b $str_1 (?:\W+ \w+ ){0,20} \W+ $str_2 \b)/gx) {
  44.         say "\t[$1]";
  45.     }
  46.    
  47.     say;
  48. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Con este código buscamos conjuntos de hasta 20 palabras que estén entre la palabra 'un' y la palabra 'de (las opciones \b son significativas, para impedir que 'un' y 'de' formen parte, respectivamente, del final y del principio de otras palabras).

El resultado es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[En un lugar de la Mancha de cuyo nombre no quiero acordarme no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero adarga antigua rocín flaco y galgo corredor ]

        [un lugar de la Mancha de cuyo nombre no quiero acordarme no ha mucho tiempo que vivía un hidalgo de los de]

(sigue más)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Observamos que ha encontrado una correspondencia de justo esa cantidad de palabras, pero, si nos fijamos bien, resulta que podría haber cortado la frase mucho antes.

Si cambiamos {0,20} por {0,20}?, indicamos que queremos quedarnos con la menor cantidad posible de palabras. Ejecutamos y sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[En un lugar de la Mancha de cuyo nombre no quiero acordarme no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero adarga antigua rocín flaco y galgo corredor ]

        [un lugar de]
        [un hidalgo de]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Ahora ha encontrado dos secuencias en sólo la primera frase, cuando antes solo encontró una sola.

Depende de lo que estés buscando, tendrás que adoptar una estrategia u otra.
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

Re: Consulta expresiones regulares

Notapor Sebastian N » 2011-02-23 17:38 @776

Buenisimooooooooo.
Es justo lo que necesitaba.
El único bug que me faltaría solucionar que cuando encuentra por ejemplo av. o leandro n. alem, lo corta como si fueran párrafos distintos.

Se me ocurrió que tal vez podría buscar el párrafo buscando "."+"\n"
¿Alguien se le ocurre alguna idea?

Igual te agradezco un montón, explorer.

Gracias
Sebastian
Sebastian N
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2010-10-23 20:59 @916

Re: Consulta expresiones regulares

Notapor explorer » 2011-02-23 17:44 @781

Se puede modificar la expresión regular para que mire lo que hay después del '.'. Puedes usar (?=...) para esa parte. Más información en perlre.
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

Re: Consulta expresiones regulares

Notapor Sebastian N » 2011-02-24 10:05 @462

¿Sería así, entonces?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ($texto =~ /\G (?<frase>.+? [.!?])(?=\n) \s*/gx) {
  2.    my $frase = $+{'frase'};
  3. print "hola \n";
  4.  
  5.     #$frase =~ s/\W+/ /g;        # quitamos los caracteres ortográficos
  6.  
  7. print "frase: " . $frase . "\n";
  8.  
  9.     push @frases, $frase;
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sste código me trae solo la primera línea, capaz que en muchos casos no hay un "\n"; por eso no anda.


Si alguno me puede dar una mano se agradece, yo estoy investigando perlre, si le encuentro la vuelta les mando la solución.

Saludos y gracias
Sebastian N
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2010-10-23 20:59 @916

Re: Consulta expresiones regulares

Notapor explorer » 2011-02-24 10:11 @466

Lo ideal sería que publicaras un ejemplo de la entrada, a ser posible con casos sencillos y otros más complicados.
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


Volver a Intermedio

¿Quién está conectado?

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