• Publicidad

Expresión regular para extraer dirección

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

Expresión regular para extraer dirección

Notapor Sebastian N » 2010-10-23 21:07 @922

Consulta: necesito extraer de un texto una dirección y altura.

Ejemplo: "Avenida independencia al 1400, se corto la avendia"

Necesito una expresión regular en Perl que sea:

<avenida|av.>+<independencia>+<la|los|al>+<numero>

Si alguien podría ayudarme, le estaría eternamente agradecido.

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

Publicidad

Re: Expresión regular para extraer dirección

Notapor explorer » 2010-10-23 21:11 @924

Bienvenido a los foros de Perl en Español, Sebastian N.

Sería algo así:

/((?:avenida|av\.) independencia (?:la|los|al) \d+)/i

En $1 estará toda la frase capturada.
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: Expresión regular para extraer dirección

Notapor Sebastian N » 2010-10-24 09:35 @441

Antes que nada, muchísimas gracias por la pronta respuesta, y abusándome un poco de tu tiempo, te quería preguntar:

El código que vos me pasaste me funciona pero no me trae el número:
texto de entrada
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
avenida independencia al 800 pegar buscar mas 2 av. callao al 7
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

respuesta
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
avenida
independencia
al
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Mi código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
(@info) = $data =~ m/(avenida|av\.) (independencia|callao) (la|los|al) \d+/i;

foreach $matchs (@info){
    syswrite STDOUT ,$matchs."\n";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo que yo necesito es obtener:
1) avenida independencia 800
2) av. callo 7

pero que venga formado de la siguiente manera:
<avenida | av.><espacio><independencia |callao |etc><preposición que se desecha, pero tiene que ser la siguiente palabra><número de cantidad de dígitos desconocidos>
Sebastian N
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2010-10-23 20:59 @916

Re: Expresión regular para extraer dirección

Notapor explorer » 2010-10-24 10:05 @462

Si el problema se reduce a ciertas palabras (avenida, independencia, callao), entonces se puede construir una expresión regular así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. my $cadena = 'avenida independencia al 800 pegar buscar mas 2 av. callao al 7';
  8.  
  9. while ($cadena =~ /((?:avenida|av(?:da)?[.]) (?:independencia|callao) (?:al|la|los) \d+)/gi) {
  10.     say $1;
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
con la salida que indicas.

El problema es si no son sólo esas palabras, sino más. Parece que quieres capturar direcciones de correo, pero nombres de calles pueden ser miles.

Quizás sea necesaria una definición más clara del patrón que estamos buscando. Por ejemplo, que estamos buscando cuatro partículas, de las cuales, sabemos qué valores tiene la primera (el tipo de calle son unos pocos); la segunda, es una palabra (lo dudo mucho); la tercera, una preposición o determinante; y la cuarta, un número.

Con esta definición, si ajustamos bien la primera y tercera partícula, sí que podemos extraer muchísimas direcciones postales. Habría que buscar los casos más difíciles (patológicos ;) ) para ver cómo integrarles en el patrón general.
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: Expresión regular para extraer dirección

Notapor Sebastian N » 2010-10-24 11:16 @511

En realidad lo que yo tengo que hacer, es de una lista de calles (40 calles) tengo que analizar si el texto las nombra; y de nombrarlas, extraer la calle y la altura, si es que figura.

Disculpa mi ignorancia, ¿qué hace el

?: y el [.]

?

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

Re: Expresión regular para extraer dirección

Notapor explorer » 2010-10-24 12:00 @542

En una expresión regular, lo normal es que cuando ponemos un par de paréntesis, queramos capturar la expresión que coincida con el patrón que indiquemos ahí dentro. Pero hay otras ocasiones en las que no queremos capturar nada. En nuestro caso, estamos usando los paréntesis para agrupar opciones, como en (avenida|avda.), pero NO queremos capturar lo que hay ahí dentro. Solo usamos los paréntesis para usar luego el '|' de alternativas dentro de ellos.

Por eso ponemos la nomenclatura (?: ... ) que sirve para indicar que esos paréntesis no capturan, solo agrupan.

Y con [.] estamos indicando un '.' literal, lo mismo que si lo hubiéramos escapado así: \. .

Si sabes las calles que quieres capturar, las puedes meter todas en una expresión regular de alternativas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6.  
  7. my $cadena = 'avenida independencia al 800 pegar buscar mas 2 av. callao al 7 y buscar en calle callao el 2';
  8.  
  9. # Tipos de calle
  10. my $tipo_calle = qr/(?:av(?:[.]|da[.]?|enida)?|c(?:[.]|alle(?:jón|juela)?)|rotonda|paseo)/i;
  11.  
  12. # Nombre de calles
  13. my @calles = ('Callao','Independencia');
  14.  
  15. my $calles = join '|', @calles;                 # las unimos
  16.  
  17. my $calle  = qr/(?:$calles)/i;                  # la exp. reg.
  18.  
  19. # Preposición / determinantes
  20. my $separador = qr/(?:al|la|el|los)/i;
  21.  
  22. # Número
  23. my $numero = qr/\d+/;
  24.  
  25. # Buscamos
  26. while ($cadena =~ /$tipo_calle ($calle) $separador ($numero)/gi) {
  27.     say "Calle: [$1] Altura: [$2]";
  28. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Aquí dividimos el problema de crear una gran expresión regular, en crear exp. regulares más pequeñas. Por ejemplo, el tipo de calle es capaz de reconocer av., avda. avenida, c., calle, callejón, callejuela, rotonda y paseo.

La exp. reg. de las calles la construimos con la ayuda de join() y qr().

Al final, lo unimos todo en una sola exp. reg., donde además aprovechamos para indicar qué partículas queremos capturar (esta vez sí) al final: la calle y el número.

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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular para extraer dirección

Notapor Sebastian N » 2010-10-24 14:01 @625

¡¡¡Sos un genio!!!

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

Re: Expresión regular para extraer dirección

Notapor Sebastian N » 2010-10-24 18:18 @804

Una consultita más:

¿Cómo puedo modificar esta línea?

my $numero = qr/\d+/;

para que además de tomarme números enteros, me tome también decimales.

Es decir, que necesitaría que me tome tanto 100 como 1.000.

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

Re: Expresión regular para extraer dirección

Notapor explorer » 2010-10-24 18:26 @809

Deberías aprender un poquito de expresiones regulares...

Sería cuestión de añadir el punto a los caracteres que estamos buscando...

my $numero = qr/[\d.]+/;
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: Expresión regular para extraer dirección

Notapor Sebastian N » 2010-10-27 10:33 @481

Fue de mucha utilidad toda la información que me pasaste.

Te quería consultar ahora los siguientes casos:

1)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#conector de negación
my $conector_negacion = qr/(?:[^,])/i;

# Buscamos calles con conectores => !, + calle + conector + calle
while ($cadena =~ /$conector_negacion + ($calle) $conector ($calle)/gi) {
     print "Calle1: $1 Calle2: $2\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En este caso lo que necesito encontrar es calle1 y calle2, con el agregado que antes de calle1 no haya una coma. Porque la idea es que si hay una coma no está hablando de un cruce de calles sino de una enumeración y eso lo tendría que tratar en otro apartado.

2)El otro caso es el encontrar la expresion regular para encontrar todas las calles consecutivas que están separadas por "," y que terminen con "y" + calle

seria:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
calle1 + "," + calle2 + "," ...... + callen-1 + "y" + "callen"
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Desde ya, muchísimas gracias.

Estuve leyendo expresiones regulares, pero me cuesta mucho.

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

Siguiente

Volver a Básico

¿Quién está conectado?

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