• Publicidad

Problemas con expresión regular

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

Notapor explorer » 2007-04-27 11:16 @511

A mi me sigue funcionando mi primera solución...

Es mejor que pongas aquí un ejemplo de la entrada que quieres procesar y un ejemplo de la salida.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Notapor rochi » 2007-04-27 12:19 @555

Hola bien, aqui va, y muchísimas gracias.

Entrada:
Código: Seleccionar todo
nombre = Pablo Perez
parcial1 = 86
obligatorio1 = 33
parcial2 = 77
obligatorio2 = 43
nombre = Pablo Sanchez
parcial1 = 98
obligatorio1 = 85
parcial2 = 35
obligatorio2 = 85
nombre = Susana Gonzalez
parcial1 = 91
obligatorio1 = 80
parcial2 = 0
obligatorio2 = 0
nombre = pablo RodrigueZ
parcial1 = 18
obligatorio1 = 5
parccccial2 = 7
obligatorio2 = 8
nombbbbbre = Ema Sanchez
parcial1 = 9
obligatorio1 = 33
parcial2 = 31
obligatorio2 = 8
nombre = Pablo Sasz
parcial1 = 86
obligatorio1 = 33
parcial2 = 77
obligatorio2 = 43
nombre = Pablo Sanchez
parcial1 = 98
obligatorio1 = 85
parcial2 = 35
obligatorio2 = 85
nombre = Paz Ada Lopez
parcial1 = 91
obligatorio1 = 80
parcial2 = 0
obligatorio2 = 0
nombre = lucia rodriguez
parcial1 = 18
obligatorio1 = 5
parccccial2 = 7
obligatorio2 = 8
nombbbbbre = Virginia Olague
parcial1 = 1
obligatorio1 = 34
parcial2 = 30
obligatorio2 = 43
nombre = Pirez  Corrales
parcial1 = 18
obligatorio1 = 5
parccccial2 = 7
obligatorio2 = 8

Salida: (sale bien)
Código: Seleccionar todo
Susana Gonzalez   91   80   0   0
Ema Sanchez   9   33   31   8
lucia rodriguez   18   5   7   8
Virginia Olague   1   34   30   43
Pirez  Corrales   18   5   7   8


El resultado es correcto, salvo lo que indica el diff, muestra el contenido de mi salida y la salida oficial (ambos idénticos), con el sig msg al final de c/archivo.
Código: Seleccionar todo
1,5c1,5
No new line at end of file.
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

Notapor explorer » 2007-04-27 14:44 @655

Es posible que justamente falte un avance de línea al final del programa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor rochi » 2007-04-27 15:46 @698

Si había probado forzándolo y escribiendo un
Código: Seleccionar todo
print "\n"
al final del código y el problema sigue.

Por otra parte si mi codigo es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($linea =~ /(=\s*)(.*)(\s*$)/)
   {
        $lin = $lin.$2."\t";
        $aux = $3;
   }
.....
print "$lin";
print "$aux";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
¿ya no estaría cubierto el \n en la variable $aux?, puesto que almacena lo que queda en (\s*$) o $3, dudas....

Gracias, saludos
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

Notapor explorer » 2007-04-27 19:25 @851

Entonces es posible que a quien le falte el \n sea al fichero de salida original con el que estás haciendo la comparación, no el fichero resultado de tu programa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor rochi » 2007-04-27 19:40 @861

Sí, pero la ausencia del \n, ¿no quedaría 'atrapada' en el \s*?, me refiero al escribir la expresión que contiene al \s* omitiría el \n, porque el * incluye que sea nulo. O sea, ¿porque no capta en 'no fin de archivo'?
Saludos
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

Notapor explorer » 2007-04-27 20:31 @897

No sé muy bien en dónde está el carácter de diferencia, pero, hablando de este ejemplo, veo que es el típico de Perl que se puede resolver de muchas formas.

Yo he encontrado una basada en una expresión regular muy amplia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l
$f = do{ local$/; open(my $fh,"<kk.txt"); <$fh> };
while(
        $f =~ m{
            ^ nomb+re      \s = \s (.*?) $ .
            ^ parcial1     \s = \s (\d+) $ .
            ^ obligatorio1 \s = \s (\d+) $ .
            ^ parc+ial2    \s = \s (\d+) $ .
            ^ obligatorio2 \s = \s (\d+) $
        }gimoxs
    ) {
    print join "\t",($1,$2,$3,$4,$5)
        if $1 !~ m/^ p .* z $/xi
    ;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Vamos, tan amplia que está buscando por un registro completo del fichero.

Salida:
Código: Seleccionar todo
Susana Gonzalez 91      80      0       0
Ema Sanchez     9       33      31      8
lucia rodriguez 18      5       7       8
Virginia Olague 1       34      30      43
Pirez  Corrales 18      5       7       8


Otra opción es la que pones tu, ir leyendo línea a línea. Otra, con una máquina de estados. Otra, leyendo los registros sabiendo que son exactamente 4 líneas cada uno. Otro, leyendo con registros separados por la marca del nombre....
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor rochi » 2007-04-27 22:02 @959

voy a probar ese código. Si mi opción es ir leyendo por línea, sabiendo que 5 filas forman un registro. Hay algo de maq. de estado, dependiendo la fila, es el campo que tengo.
Saludos, y muchas gracias
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

Notapor rochi » 2007-05-01 01:05 @087

Hola, tengo otra vez problemas. Debo reconocer los enlaces de un archivo .html.

Entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <a href="letra.doc"> 
  2. DOC</a>  
  3.  
  4. <a href="letra.rtf">RTF</a> 

Las líneas correspondiente al tag de un link pueden tener \n, osea, ocupar más de una línea.

Salida:
Código: Seleccionar todo
DOC   "letra.doc"
RTF   "letra.rtf"

Debe estar en una sola línea por link, y cada palabra separada por tabulador.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$er_links = '(<\s*a\s*href\s*=\s*)(\")(.*)?(\")?(\s*>)(.*)?(<)(\s*/a\s*>)';

  if ($file_aux =~ /$er_links/gism)
                         {
                          @titlink = split /\n/ , $6 ;
                          foreach $palabra(@titlink)
                          {
                            print $palabra;
                          }
                          print "\t";

                          @link = split /\n/ , $3 ;
                          foreach $plink(@link)
                          {
                            print "\"".$plink."\"";
                          }
                          print "\n";
                        }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No resuelve lo que quiero, me aparece el ultimo rótulo RTF y luego toda la línea del tag, pero no la palabra. Les agradezco cualquier sugerencia.
saludos
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

Notapor explorer » 2007-05-01 06:54 @329

Esa pregunta está respondida en el perlfaq9, en la pregunta "How do I extract URLs?".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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