Página 3 de 4

NotaPublicado: 2007-04-27 19:40 @861
por rochi
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

NotaPublicado: 2007-04-27 20:31 @897
por explorer
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.003 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....

NotaPublicado: 2007-04-27 22:02 @959
por rochi
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

NotaPublicado: 2007-05-01 01:05 @087
por rochi
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

NotaPublicado: 2007-05-01 06:54 @329
por explorer
Esa pregunta está respondida en el perlfaq9, en la pregunta "How do I extract URLs?".

NotaPublicado: 2007-05-01 06:56 @330
por explorer
Creo que usas demasiados paréntesis...
Humm... cuidado con los 'glotones' (.*)... casi mejor les pones a 'mínimos' (.*?).

NotaPublicado: 2007-05-01 07:08 @339
por explorer
¡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...

NotaPublicado: 2007-05-01 12:45 @573
por rochi
gracias, disculpen, en el apuro no lo vi.
saludos

NotaPublicado: 2007-05-02 00:17 @054
por rochi
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.

NotaPublicado: 2007-05-02 07:34 @357
por explorer
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