• Publicidad

A vueltas con las expresiones regulares

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

A vueltas con las expresiones regulares

Notapor mikel_2 » 2011-08-26 08:20 @389

Hola nuevamente, estoy haciendo un script que me imprima la cantidad de resultados de buscar una cadena de texto en diferentes buscadores, pero como sugiere el título tengo un problema con las expresiones regulares... Lo que se me ocurrió fue hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if($url =~ /resultCount">(\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?)/) { print "$1 resultados para \"$search\" en Yahoo.\n"; }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La variable $url tiene dentro la página donde se encuentran los resultados. Yahoo y los demás buscadores separan los resultados de la búsqueda por un . cada 3 cifras y lo único que se me ocurrió está arriba :), pero esta variable falla cuando por ejemplo el resultado es 3.000.000, y funciona siempre que la primera cifra tenga más de un dígito (o eso creo, el caso es que muchas veces no funciona). ¿Qué expresión regular podría resolver este problema?

Aquí el código completo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use LWP::Simple;
  3. use URI::Escape;
  4. print "Buscar: ";
  5. my $search = <>;
  6. chomp $search;
  7. my $coded = uri_escape("$search");
  8. my $busqueda = "http://es.search.yahoo.com/search;_ylt=AvtvYP2k0jZxHsKUYtldlgldoq5_;_ylc=X1MDMjE0MjE1MTI2MQRfcgMyBGZyA3lmcC10LTcwNQRuX2dwcwMwBG9yaWdpbgNlcy55YWhvby5jb20EcXVlcnkDamhqaGpoamgEc2FvAzE-?vc=&vl=&fl=&p=$coded&toggle=1&cop=mss&ei=UTF-8&fr=yfp-t-705";
  9. my $url = get($busqueda) or die print "Error!";
  10. if($url =~ /resultCount">(\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?)/) { print "$1 resultados para \"$search\" en Yahoo.\n"; }
  11. $busqueda = "http://www.bing.com/search?q=$coded&go=&qs=n&sk=&sc=8-4&form=QBLH&filt=all";
  12. $url = get($busqueda) or die print "Error!";
  13. if($url =~ /count">1-10 de (\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?\d+\.?)/) { print "$1 resultados para \"$search\" en Bing.\n"; }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


P.D.: Muy buenos los artículos que hay sobre expresiones regulares acá.



Saludos
mikel_2
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-08-23 15:29 @686

Publicidad

Re: A vueltas con las expresiones regulares

Notapor explorer » 2011-08-26 09:45 @448

El punto al que te refieres es el separador de millares.

Prueba con esta regex:

$url =~ /resultCount">(\d+(\.\d{3})*)/

O esta otra:

$url =~ /resultCount">(\d+[.\d+]*)/

La primera es mejor, pues detectaría el caso de una cifra puesta justo delante de un punto de final de frase, como en «La bañera costó 3.000.».
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

Re: A vueltas con las expresiones regulares

Notapor mikel_2 » 2011-08-27 06:56 @330

Solucionado, muchas gracias :)
mikel_2
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-08-23 15:29 @686


Volver a Básico

¿Quién está conectado?

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