• Publicidad

Problemas expresion regular: búsqueda subcadena

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

Problemas expresion regular: búsqueda subcadena

Notapor llauraff » 2012-12-19 14:02 @626

Hola. Tengo que hacer un ejercicio que consiste en buscar la subcadena "la" y devolver las dos líneas anteriores y las dos posteriores de un texto.

Yo tengo algo como sigue:

my @solucion = ($cadena =~ m/(.*\n.*\n).*la.*\n(.*\n.*)/g);

Lo aplico al texto siguiente que se lee de un fichero y almaceno en $cadena:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. hola este texto
  2. es una prueba para el segundo
  3. ejercicio de entrega
  4. de expresiones regulares
  5. en el que tenemos que encontrar
  6. alguna vez la subcadena
  7. en todo el texto
  8. podremos encontrarla
  9. o tendremos que buscar y buscar
  10. sin exito
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Bueno, pues cuando recorro el vector, en la posición cero y en la una tengo almacenado correctamente la segunda y tercera línea y la quinta y la sexta... pero luego en la posición dos tengo almacenado la linea séptima y en la posición tres las líneas novena y décima.

¿¿¿Dónde estoy metiendo la pata??? ¿¿¿¿¿O es que no se puede hacer así?????

Muchas, muchas gracias a todos.
llauraff
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-12-17 08:49 @409

Publicidad

Re: Problemas expresion regular: búsqueda subcadena

Notapor explorer » 2012-12-19 15:50 @701

El problema no es sencillo, porque alguna 'la' es capturada por una captura anterior...

Esto es lo que me sale a mi cuando ejecuto tu solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $cadena = do { local $/; open F, "kk.txt"; <F> };
  3.  
  4. my @solucion = ($cadena =~ m/(.*\n.*\n).*la.*\n(.*\n.*)/g);
  5.  
  6. for (@solucion) {
  7.     print "[$_]";
  8. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[es una prueba para el segundo
ejercicio de entrega
][en el que tenemos que encontrar
alguna vez la subcadena][
en todo el texto
][o tendremos que buscar y buscar
sin éxito]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Entonces vemos que hay cuatro elementos.
El primero contiene las dos líneas anteriores al primer 'la'.
El segundo contiene las dos líneas siguientes al primer 'la'.
El tercero contiene la línea anterior y el final de la línea anterior a la anterior, del tercer 'la'.
El cuarto contiene las dos líneas siguientes al cuarto 'la'.

Entonces... en la expresión regular hay que tener en cuenta el caso de comenzar a buscar por el siguiente 'la' justo después de la posición del recién encontrado. Eso lo consigues llamando a pos() y usando las variables especiales @- o @+ se pueden saber las posiciones de las cosas que vamos encontrando (Más información en tu propio ordenador en perldoc perlvar, y en la Web (traducido al español)).

Humm... Yo creo que se resuelve mucho más fácil usando Tie::File y aplicando la expresión regular línea por línea del archivo.
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: Problemas expresion regular: búsqueda subcadena

Notapor llauraff » 2012-12-20 12:48 @575

Hola, como llevo muy poco tiempo con esto del Perl he buscado una solución algo más "cutre". Al final lo cargué todo en un vector y voy aplicando el patrón de buscar "la" a cada posición del array y si lo encuentra busco las dos anteriores y las dos siguientes...

En fin, cuando mis conocimientos y práctica aumente volveré sobre ello.
Gracias
llauraff
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-12-17 08:49 @409

Re: Problemas expresion regular: búsqueda subcadena

Notapor explorer » 2012-12-20 13:24 @600

... que es justo lo que hace Tie::File ;)

Un ejemplo.
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: Problemas expresion regular: búsqueda subcadena

Notapor llauraff » 2012-12-21 03:06 @171

¡Oh!, gracias, gracias... ¡¡Lo que me queda por aprender y practicar!!
llauraff
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2012-12-17 08:49 @409


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados

cron