• 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 rochi » 2007-04-24 18:11 @799

Si cambié la expresión, pero aún no doy en la tecla.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$expreg = '(\w+ = )([^P].*[^Z]$?)(\s*)';
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo que necesito es $2, lo que está después del "=". Al considerar /exp/s se supone que el "." considera también los blancos hasta que alcanza una Z antes del fin de línea.

Y aqui 'matcheo':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($linea =~ /$expreg/gsi)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todos modos sigo sin comprender. Susana Gonzalez lo toma correctamente, pero a Pablo Jara no, y lo es, y Pirez Corrales lo toma como no válido y lo es; el nombre completo finaliza en 'a', no en 'z'.
Pablo Gomez lo filtra bien.

Saludos
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

Publicidad

Notapor explorer » 2007-04-24 19:55 @872

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

@lineas = (
  'nombre = Pablo Gomez',
  'nombre = Pablo Sasz',
  'nombre = Paz Ada Rodriguez',
  'nombre = Susana Gonzalez',
  'nombre = Ema Sanchez',
  'nombre = lucia rodriguez',
  'nombre = Virginia Olague',
  'nombre = Pirez Corrales',
);

foreach $linea ( @lineas ) {

    if ( $linea !~ /= (p.*z)$/i ) {
        print "$1\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que hacemos es justo lo que rochi ha pedido: la $linea no ha de coincidir (!~) con el patrón de un '= ' seguido por un nombre que comienza por 'p' y termina ($) por una 'z'.

El truco está en usar el '= ' como ancla de posición para indicar dónde queríamos ver si estaba la 'p'.
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-24 21:43 @946

Para imprimir el $1 tengo problemas, está vacío, supongo que es porque al no respetar el patrón, no hay nada que comience con p y termine con z.
Por el momento lo solucioné así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($linea !~ /$expreg/si)
   {
         if ($linea !~ /$expreg/i)
       {
              if ($linea =~ /(=\s*)(.*)(\s?$)/)
                 {
                      $lin = $lin.$2."\t";
                      $aux = $3;
                  }
}    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Aclaro que concateno porque la salida, cada 4 renglones debe la información desplegarse en el mismo renglón, por la lógica de la información. Obvié esos detalles de algoritmia que sí me funcionan.
Lo que no funciona es que a veces necesito imprimir el valor de $3. O sea lo que siga después de la palabra, ya sea nada o una nueva línea. Si no pongo el valor en $aux, cuando $3 no tiene nada sale un msg diciendo que la misma no fue inicializada. Almacenando el valor en $aux no tengo ese problema. ¿Qué alcance tienen estas variables?
¿Cómo saber si $3 es 'null'? (así sé cuándo imprimirlo)
La solución con $aux me funciona a medias, por momentos agrega un \n que no debería aparecer.


Gracias por la ayuda que me has venido dando.

No entiendo qué está mal en esta expresión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$expreg = '(\w*\s*=\s*)(^[^p].*[^z]$)';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Quiero tomar $2, lo que no comience con p y ni termine con z.

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

Notapor explorer » 2007-04-25 02:18 @137

En el código, has puesto dos veces la misma condición. Con la primera condición, es suficiente.

El obviar detalles es crucial para dar una respuesta, sobre todo en Perl. El lenguaje es potente, pero no tanto como para distinguir detalles.

El alcance de las variables normales es en el del contexto en que se definen. El alcance de las variables numéricas ($1, $2, ...) también es el del contexto, salvo que son modificadas en cada expresión regular que tenga éxito.

Para saber si $3 es nula, pues eso mismo: if ( ! $3 ) { ...}

Para saber lo que está mal de la expresión regular hay que ver antes un ejemplo de la entrada, o al menos, detallarla.
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 09:39 @443

Repaso el problema, filtrar nombres completos que comiencen con 'P' y terminen con 'z'.
Por ejemplo: Pablo Gomez, Pilar Rodriguez, deben ser filtrados.
En cambio Luis Fuentes, Paz Abate deben ser aceptados.
Pues bien eso me funciona. Pero cuando hago una comparación de lo que se pretende sea el archivo de salida y el mío (usando diff)
Me sale:
1,5c1,5
Contenido de los 2 archivos (que es idéntico) y al final de c/u la frase:
No new line at end of file.

Los nombres vienen por filas, y la ultima no tiene \n.

Código que uso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$expreg = '(=\s*)(p.*z)\s*$';

if ($linea !~ /$expreg/si)
   {
         if ($linea !~ /$expreg/i)
       {
              if ($linea =~ /(=\s*)(.*)(\s*$)/)
                 {
                      $lin = $lin.$2."\t";
                      $aux = $3;
                  }
}    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
saludos, gracias
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

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

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.001 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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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