• Publicidad

Aprendiendo expresiones regulares

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

Aprendiendo expresiones regulares

Notapor foreop » 2012-03-24 12:55 @580

¡Hola!

Estoy comenzando a usar expresiones regulares y estoy intentando hacer estos "ejercicios":

Palabras que:
- empiecen y acaben con la misma vocal
- acaben en vocal acentuada
- solo contengan la vocal 'u'
- con cuatro o más letras 's'
- contengan dos vocales

Para el primer caso:
Sintáxis: [ Descargar ] [ Ocultar ]
  1.  
  2. foreach (@palabras){ 
  3.     if($_ =~ /^[aeiou].[aeiou]$/){ 
  4.         print $palabra."\n"; 
  5.     } 


Así me coge palabras como: uva, ira...

¿Cómo puedo hacerlo para que coja palabras que acaben y empiecen en vocal, pero que sean de más de 3 letras?
¿Y para que acaben y empiecen con la misma vocal?

Estoy un poco perdido, ¡je,je!

¡Un saludo y gracias!
foreop
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-03-24 12:46 @574

Publicidad

Re: Aprendiendo expresiones regulares

Notapor explorer » 2012-03-24 13:17 @595

Bienvenido a los foros de Perl en Español, foreop.

foreop escribiste:¿Cómo puedo hacerlo para que coja palabras que acaben y empiecen en vocal, pero que sean de más de 3 letras?
El comodín '.' solo coincide con un carácter, así que hay que ponerle un modificador para que coincida con 3 o más caracteres.

Ponlo así: .{3,}

foreop escribiste:¿Y para que acaben y empiecen con la misma vocal?
Esto requiere que la "segunda vocal" sea la misma que la "primera vocal". Es decir: el patrón debe ser capaz de recordar cuál fue la primera vocal, para indicar cuál debe ser la segunda.

Lo que debes hacer es capturar la primera vocal, con paréntesis de captura, y luego, en la parte de la segunda vocal, pones \1, que estará haciendo referencia al primer par de paréntesis de captura. Queda así:

/^([aeiou]).{3,}\1$/

Más información en perldoc perlre
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

Re: Aprendiendo expresiones regulares

Notapor foreop » 2012-03-24 13:29 @604

Me he expresado mal respecto a lo de 3 letras. Yo quiero buscar tanto uva como ebro, es decir palabras que empiecen y terminen por vocal, sin importar el numero de letras que haya por medio.

Si pongo: /^[aeiou].[aeiou]$/ Empieza y termina por vocal, pero solo hay una letra en medio, yo quiero que pueda haber "infinitas" xD
Lo he intentado con *, y algunos mas pero me salen cosas un poco raras.

Lo de capturar mediante parentesis, si me ha quedado claro ;)

¿Como compruebo vocales acentuadas?

Muchas gracias ;)
foreop
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-03-24 12:46 @574

Re: Aprendiendo expresiones regulares

Notapor explorer » 2012-03-24 14:36 @650

foreop escribiste:Me he expresado mal respecto a lo de 3 letras. Yo quiero buscar tanto uva como ebro, es decir palabras que empiecen y terminen por vocal, sin importar el numero de letras que haya por medio.

Si pongo: /^[aeiou].[aeiou]$/ Empieza y termina por vocal, pero solo hay una letra en medio, yo quiero que pueda haber "infinitas" xD
Lo he intentado con *, y algunos mas pero me salen cosas un poco raras.
Prueba con el operador "avaricioso" .* . Cuidado, porque también capturará espacios en blanco.

Más información en perldoc perlre, y en la sección "El asterisco" en la página Expresiones regulares de Wikipedia.

foreop escribiste:¿Cómo compruebo vocales acentuadas?
¿Escritas en qué codificación? Por lo general, es mejor usar un layer de E/S para traducir el texto que leemos a la codificación interna de Perl, y a partir de ahí es más fácil hacer esa búsqueda.

De esto ya hemos hablado en otras ocasiones: Reemplazar caracteres acentuados en archivo
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

Re: Aprendiendo expresiones regulares

Notapor foreop » 2012-03-25 10:03 @460

Ya me funciona lo de los acentos. No entiendo esto:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. use encoding 'utf8'; #script en UTF-8 
  2. use open IO => ':utf8'; #Entrada salida en UTF-8 
  3. open(FO,">log.txt"); 
  4. foreach ( @palabras ) { 
  5. print FO $_; 
  6. close(FO); 


Encoding se refiere a la codificación del script. Ahora ya no puedo ejecutar el script con "./script.pl". Me dice "cannot execute binary file". Estoy usando la consola del MINGW. ¿Por qué?

El open IO se supone que es para leer y escribir ficheros en UTF-8, ¿por qué log.txt me lo saca como "ANSI"?

Por otro lado, para las palabras que solo contengan la vocal 'u', ¿por qué no me sirve: "/[u][^aeio]/"?

¡¡Gracias!!
foreop
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-03-24 12:46 @574

Re: Aprendiendo expresiones regulares

Notapor explorer » 2012-03-25 13:04 @586

foreop escribiste:Ahora ya no puedo ejecutar el script con "./script.pl". Me dice "cannot execute binary file". Estoy usando la consola del MINGW. ¿Por qué?
Quizás falta la primera línea de shebang.


foreop escribiste:El open IO se supone que es para leer y escribir ficheros en UTF-8, ¿por qué log.txt me lo saca como "ANSI"?
¿Quién te dice que está en "ANSI"? ¿No será Unicode 16?


foreop escribiste:Por otro lado, para las palabras que solo contengan la vocal 'u', ¿por qué no me sirve: "/[u][^aeio]/"?
Esa expresión quiere decir: "encuentra un 'u' seguida por 'algo' que no sea ni 'a', ni 'e', ni 'i', ni 'o'.

Quizás sea más sencillo buscar por "que no esté la 'u', de principio a fin, en cualquier número de letras": /^[^u]+$/.
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

Re: Aprendiendo expresiones regulares

Notapor foreop » 2012-03-25 15:42 @695

Ya tengo todas las expresiones regulares hechas ;)

Lo de "ANSI" no sé por qué era, el Notepad++ lo marcaba como ANSI, ahora sí sale UTF-8.

Solo me quedan un par de dudas respecto a la codificación.

Sintáxis: [ Descargar ] [ Ocultar ]
  1. #!/usr/bin/perl  
  2.  
  3. use strict; 
  4. use warnings; 
  5.  
  6. use encoding 'utf8'; #script en UTF-8 
  7. use open IO => ':utf8'; #Entrada salida en UTF-8 
  8.  
  9. open(F1, "entrada.txt"); 
  10. my @palabras=<F1>; 
  11. close(F1); 
  12.  
  13. foreach ( @palabras ) { 
  14.     print $_; 
  15.  
  16. open(FO,">salida.txt"); 
  17. foreach ( @palabras ) { 
  18.     print FO $_; 
  19. close(FO); 


Con ese código:
  1. Tengo que ejecutarlo como: perl script.pl (./script.pl me dice "cannot execute binary file").
  2. Los caracteres acentuados, no se ven bien en la consola. (La consola usará codificación diferente).
  3. Lee y escribe archivos UTF-8 perfectamente.

¿Por qué pasa 1?

¿Qué debería hacer para poder abrir un archivo en cualquier codificación como utf-8?

¡Gracias!
foreop
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-03-24 12:46 @574

Re: Aprendiendo expresiones regulares

Notapor Birei » 2012-03-25 15:58 @707

Para ejecutarlo como ./script.pl comprueba dos cosas:

1.- El archivo es ejecutable:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. chmod u+x script.pl
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

2.- La ruta del intérprete Perl: Pon la que te devuelva el comando
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. which perl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
o pon directamente
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. #!/usr/bin/env perl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Para abrir cualquier archivo con codificación utf-8, hay varias formas, aquí te doy una. Añade la siguiente instrucción al principio del programa:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use open IN => ':utf8';
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Birei
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-06-19 13:27 @602

Re: Aprendiendo expresiones regulares

Notapor foreop » 2012-03-25 16:25 @725

Ya le dí permisos y comprobé la ruta... y nada xD. Quizás sea por el MINGW.

Lo que yo quiero es:
* Abrir un archivo, sin importar la codificación.
* Tratarlo como si fuese utf-8.
* Escribir otro archivo, con la misma codificación que el primero.

Sería como una especie de traductor, para trabajar siempre con la misma codificación sin importar los archivos.
¿Eso existe en Perl? ¿O habría que implementarlo?

¡Muchas gracias!
Una comunidad muy activa, ¡enhorabuena! ;)
foreop
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-03-24 12:46 @574

Re: Aprendiendo expresiones regulares

Notapor Birei » 2012-03-25 16:38 @734

Sí existe. El módulo es Encode, y las funciones encode y decode.
Birei
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-06-19 13:27 @602

Siguiente

Volver a Básico

¿Quién está conectado?

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