• Publicidad

Reconocer patrón con constantes y sec. de escape

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

Reconocer patrón con constantes y sec. de escape

Notapor bartoldo » 2006-04-03 12:26 @559

Pues bien, tengo otro problema, no he encontrado algún tutorial que tenga ejemplos más sustanciosos. Es decir, cuando quiero reconocer strings del tipo Proceso cualquier cosa nombre{nom1}, uso el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if /Proceso(\.*)nombre:{(\s*\w+\s*)}/
  2.    print $2; //imprimiría el nombre del proceso
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pues bien, la mezcla entre secuencias de escape (\.*,etc), y strings 'constantes' no sé cómo llamarle (nombre, Proceso,{,}), me causa problemas cuando las tengo mezcladas como en este ejemplo, y no me reconoce el patrón.

Gracias, saludos
bartoldo
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2006-04-01 17:18 @763

Publicidad

Re: Reconocer patron con constantes y sec. de escape

Notapor explorer » 2006-04-03 12:48 @575

bartoldo escribiste:pues bien, tengo otro problema, no he encontrado algún tutorial que tenga ejemplos más sustanciosos.
En este web hay un par de ellos: http://perlenespanol.com/archives-tut/c ... lares.html

bartoldo escribiste:Es decir, cuando quiero reconocer strings del tipo Proceso cualquier cosa nombre{nom1}, uso el siguiente código
Primero, \.* no es "cualquier cosa", sino que es "0 o más puntos". "Cualquier cosa" es .*. A veces se nos escapa lo que hay que escapar (o no :) )

En cuanto al patrón que buscas, entiendo que sería
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( /Proceso.+nombre:\{(\s*\w+\s*)\}/ ) {
  2.     print "Proceso: $1\n";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
que según veo, entre los corchetes, lo que buscas es una única palabra rodeada posiblemente por espacios en blanco.

En muchas ocasiones, la mejor forma de construir una expresión regular es yendo poco a poco y utilizando la línea de comandos, ya que perl lo podemos ejecutar desde ella.

Si tengo que reconocer un patrón complicado, como por ejemplo (0(9|8)_|new_*)?price(2|_new|_0(8|9))?\.zip, primero intentaría hacerlo paso a paso, por cada par de paréntesis de captura. (Ese patrón reconoce nombres de ficheros zip infectados con el virus Bagle.bg).
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

Notapor bartoldo » 2006-04-03 13:44 @614

Gracias, siempre dando una mano.

Sí, no era cualquier cosa, quise decir que fuera cualquier carácter y sin querer puse el "\". Efectivamente estoy armando las expresiones de a poco, pero llego a un punto que no veo salida.

El tutorial lo estuve leyendo, pero no vi algo referente a la sustitución de cadenas como necesito. Sino algo más bien descriptivo.

Por ejemplo, si pongo algo del tipo $var = "\w*" me genera problemas.

Si lo pongo \w* funciona como una 'macro'. Sin embargo, el contenido de otras variables sí puedo ponerlo entre " ". Son detalles, pero para quienes comenzamos no están en ningún tutorial, sino en la experiencia por las macanas.

Ahora por ejemplo tengo que buscar algo del tipo \cite{ cita cualquiera} y hay solo una que no me la reconoce, sí el resto de las 'cite'. Única restricción: lo que va entre {} está en minúscula.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $er_label = '(\s*[a-z]\w*\s*)((,\s*[a-z]\w*\s*|)*)'; if /\\label\{$er_label\}/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Por otra parte debo reconocer cosas del tipo (ocupa varias líneas)
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
\begin{figure}
............
label\{nombreFigura}
.................
\end{figure}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y sustituirlo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. s/\\begin\{figure\}.*\\label\{(\s*\w+\s*)\}\\end\{figure\}/Figura: $1/gsm;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No me está funcionando, ni esto
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. s/\\begin\{figure\}(\s*\w+\s*)\\end\{figure\}/Figura: $1/gsm;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sigo viendo, gracias.
bartoldo
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2006-04-01 17:18 @763

Re: Reconocer patrón con constantes y sec. de escape

Notapor explorer » 2006-04-03 14:20 @639

bartoldo escribiste:Sin embargo, el contenido de otras variables si puedo ponerlo entre " ", son detalles, pero para quienes comenzamos no están en ningun tutorial, sino en la experiencia por las macanas.
Lo he entendido. Lo que quieres es meter expresiones regulares en variables.

Una forma de hacerlo es con el operador qr
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $patron = qr{(\s*[a-z]\w*\s*)((,\s*[a-z]\w*\s*|)*)};
  2. if ( $linea =~ /$patron/ )  { ... }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero tal como lo haces también es válido.

bartoldo escribiste:Ahora por ejemplo tengo que buscar algo del tipo \cite{ cita cualquiera}
Si lo que va entre corchetes no tiene corchetes, se podría seleccionar la cita de esa manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $linea =~ /\\cite\{(.+?)\}/;
  2. print $1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


bartoldo escribiste:Por otra parte debo reconocer cosas del tipo
\begin{figure}
............
label\{nombreFigura}
.................
\end{figure} y sustituirlo.
¡Anda!. ¡Si parece rtf! ¿O es Latex?

bartoldo escribiste:s/\\begin\{figure\}.*\\label\{(\s*\w+\s*)\}\\end\{figure\}/Figura: $1/gsm; no me está funcionando, ni esto:
s/\\begin\{figure\}(\s*\w+\s*)\\end\{figure\}/Figura: $1/gsm;
Supongamos que el fichero kk.rtf sea
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
\begin{figure}
............
\label{   nombreFigura1}
.................
\end{figure}

\begin{figure}
............
\label{nombreFigura3    }
.................
\end{figure}

\begin{figure}
............
\label{   nombreFigura2   }
.................
\end{figure}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Luego tenemos el programa Perl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. open FILE, "<kk.rtf";
  3. while ( <FILE> ) {          # Leemos todo el fichero a una variable
  4.   $fichero = $fichero . $_;
  5. }
  6. close FILE;
  7. $fichero =~ s/\\begin\{figure\}.*?\\label\{\s*(\w+)\s*\}.*?\\end\{figure\}/Figura: $1/gsm; # ¡Transmutación!
  8. print $fichero;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Entonces la salida es
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Figura: nombreFigura1

Figura: nombreFigura3

Figura: nombreFigura2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Explicación: El conjunto '.*' es algo 'peligroso' porque significa 'cualquier secuencia de caracteres' y 'cualquiera' es eso: por defecto, el '*' se 'come' TODOS los caracteres que pueda encontrar. Si no pusiéramos el '?', el '.*' que hay detrás del primer \begin reconocería todos los caracteres hasta el ÚLTIMO \label del fichero. Mientras que, con el '*' le decimos que coja TODOS los posibles, con el '*?' le decimos que coja los MENOS POSIBLES, porque no queremos que vaya 'más allá' de lo razonable.

A tu expresión regular le faltaba un '.*' y poner los '?' para evitar la glotonería. Además, fíjate que he sacado los '\s*' fuera de la captura, para aprovechar y quitar los espacios en blanco de las etiquetas.
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

Notapor bartoldo » 2006-04-03 15:38 @693

Exacto, es un analizador sintáctico para un texto en Latex.

Bueno, pude reconocer las figuras, solo me falta ahora, capturar una de las citas. Tampoco con esta exp. reg. me pasa /\\cite\{(.+?)\}/, pero la acomodé a que fuera /\\cite{\s*[a-z](.+?\}/ porque deben comenzar con minúsculas.

La única cosa a distinguir es que dice 'cite{algo}.' (fin de línea) Pero no es la única 'cite' previo a un '.' y "\n". No sé por qué a esa en particular no la reconoce.

Genial el '?', me di cuenta tal como estaba me tragaba más strings que los que necesitaba, estaba viendo cómo frenar eso.

Te agradezco las aclaraciones, saludos.
bartoldo
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2006-04-01 17:18 @763


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 10 invitados