• 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-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

Publicidad

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.004 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.002 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

Notapor explorer » 2007-05-01 06:56 @330

Creo que usas demasiados paréntesis...
Humm... cuidado con los 'glotones' (.*)... casi mejor les pones a 'mínimos' (.*?).
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 explorer » 2007-05-01 07:08 @339

¡Oops!

Y además... ese tema se ha tratado por este foro en más de una ocasión...
viewtopic.php?t=877&highlight=extraer+url

A veces nos olvidamos del sistema de búsqueda...
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-05-01 12:45 @573

gracias, disculpen, en el apuro no lo vi.
saludos
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

Notapor rochi » 2007-05-02 00:17 @054

Hola, tengo entradas que son de este otro tipo

(598)29022000 int# 42
29101010 Interno # 156
2900 1212 #interno 111
598 2422 4456 # INT. 23

donde debo reconocer lo que va dsps de # para ingresar un texto.

Exp. reg
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$er_telef_2 = '(598)?(\D*)(\d{4,8})(\s*\D*\s*)(\d{4,8})(\s*\D*\s*)(#{1}\s*\D*)(\d+\s*)$';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Bien las tiras las reconoce, pero tengo un problema, si comparo el archivo de salida 'oficial' con la salida que yo tengo (diff mediante), hay problema en la ultima linea, que corresponde con la ultima leida del archivo de entrada.
Esa línea no tiene \n, la expresion reg. no lo detecta, como debe ser, sin embargo el msg del diff es el sig.: "No newline at end of file"
Asi mismo en entiendo porqué pasa eso, gracias a todos.
rochi
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2007-04-23 02:03 @127

Notapor explorer » 2007-05-02 07:34 @357

No entiendo... si sólo necesitas lo que va después de '#', ¿por qué no pones eso justamente en la expresión regular?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -l

@x = (
    '(598)29022000 int# 42'     ,
    '29101010 Interno # 156'    ,
    '2900 1212 #interno 111'    ,
    '598 2422 4456 # INT. 23'   ,
);

foreach ( @x ) {

    ($t2) = $_ =~ /#\s*(.+)\s*$/;
    print "$t2.";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema de la última línea ya está comentado antes: el fichero de entrada no tiene ese último carácter de fin de línea.

Lo que se suele hacer es:
* Bucle para todas las líneas del fichero:
* ____ Le QUITAMOS a la línea leída el/los (posible(s)) carácter de fin de línea con chomp()
* ____ Procesamos la línea (expresión regular, sustitución, cálculo, etc.
* ____ Pintamos el resultado CON un nuevo carácter de fin de línea (\n)
* Fin del bucle
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 1 invitado