• Publicidad

Ayuda expresiones regulares: nº carac. en una palabra

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

Ayuda expresiones regulares: nº carac. en una palabra

Notapor aremaku » 2012-04-14 12:07 @547

Hola,

Me presento: Soy estudiante de informática que, desde hace poco, ha empezado a programar en Perl. Os escribo para ver si me podéis ayudar en una duda que me ha surgido respecto a las expresiones regulares:

Quiero buscar en una BD las palabras que contengan un número determinado de caracteres. Por ejemplo: Buscar todas las palabras que contengan 3 o más letras "l", como "libelula"; o buscar todas las palabras que tengan solamente 3 vocales "a" como "amada".

Llevo toda la mañana dándole vueltas. Lo más parecido que encuentro es: /l{3,}/ pero eso me busca las palabras que tengan 3 o más letras "l" juntas. He probado otras cosas como: /\D*l{1}\D*l{1}\D*l{1}*\D/ pero tampoco. Creo que estoy "dando palos de ciego" con este tema, ¿me podéis echar un cable?

Gracias, un saludo.
aremaku
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-04-14 11:54 @537

Publicidad

Re: Ayuda expresiones regulares: nº carac. en una palabra

Notapor explorer » 2012-04-14 19:21 @848

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

La solución la tienes en tu propio ordenador, ejecutando perldoc -q count. En la primera pregunta de perlfaq4, How can I count the number of occurrences of a substring within a string? te dan varias técnicas.

La idónea para ti es la de

$veces = string =~ tr/l//;.
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: Ayuda expresiones regulares: nº carac. en una palabra

Notapor aremaku » 2012-04-15 10:33 @481

Genial, me funciona a la perfección. Muchas gracias por la ayuda :)

Un saludo.

PD: tengo una dudilla más: Quiero localizar, por ejemplo, palabras que tengan dos vocales y que una de ellas esté acentuada. Por ejemplo, "belén".

Uso:

if(@texto[$i]=~tr/e// == 1 and @texto[$i]=~tr/é// == 1 and @texto[$i]=~tr/[aiouáíóú]// == 0)

pero no me localiza nada, solo me ha pasado con las acentuadas, porque en este caso:

if(@texto[$i]=~tr/e// == 2 and @texto[$i]=~tr/[aiouáíóú]// == 0)

me va perfecto.

Uso Notepad++ con codificación UTF-8.
aremaku
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-04-14 11:54 @537

Re: Ayuda expresiones regulares: nº carac. en una palabra

Notapor explorer » 2012-04-15 12:19 @555

Pues, según la versión de Perl que tengas instalada, puedes tener un problema tremendo.

Para saber la versión de Perl, ejecuta perl -v.

Si es un Perl moderno, prueba a poner

use utf8;

al principio del programa. Esto indica que tu código está escrito en esa codificación.
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: Ayuda expresiones regulares: nº carac. en una palabra

Notapor aremaku » 2012-04-15 12:31 @563

Tengo la versión de Perl 5.14.2 que creo tener entendido que es la última versión estable.

He probado a añadir: "use utf8;" pero obtengo el mismo resultado. Es raro porque en el mismo programa he realizado otras búsquedas como palabras que contengan "a" acentuada:

@texto[$i]=~/á/

y otras parecidas y, en todos los casos, ha funcionado.
aremaku
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-04-14 11:54 @537

Re: Ayuda expresiones regulares: nº carac. en una palabra

Notapor explorer » 2012-04-15 12:56 @581

No es @texto[$i], sino $texto[$i].

El sigilo que va delante de la variable indica el tipo de dato que queremos obtener. '@' es para una lista, '$' para un escalar (un solo valor).

Mira lo que le acabo de responder a Doddy.

En cuanto al problema, todo lo que tenga que ver con las codificaciones de texto, es un pequeño infierno.

Hace poco que hemos iniciado una serie sobre el tema, en el subforo de avanzado: 44 recetas para trabajar con Unicode en Perl.

En resumen:

* si tienes literales utf8 en tu código (porque lo estás creando con un editor con codificación utf8), entonces debes poner el 'use utf8;' al principio

* si vas a leer archivos codificados así, hay que usar algo como el módulo utf8::all (con lo que además, puedes quitar el 'use utf8;' anterior), o usar el pragma open (como se indica en la receta 0 enlazada antes). El objetivo es que los archivos que vamos a leer pasen por alguna capa E/S de traducción de codificaciones, para que los pase de uf8 al formato interno de Perl, que es Unicode (no confundir con utf8). A la hora de sacar la información hay que tener la misma preocupación.

* Otro tema son las expresiones regulares (tr incluido), pero con el 'use utf8' debería ser suficiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > perl -E 'use utf8; $_ = "éeeeeéée"; $v = tr/é//; say $v'
  2. 3
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Hay varios documentos en Perl que tratan el asunto del Unicode: perlunitut, perluniintro y perlunicode.

El siguiente ejemplo sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use utf8;
  4. use open qw<:utf8 :std>;        # Entradas y salidas estándar en modo utf8
  5.  
  6. my @palabras = qw< belén >;
  7.  
  8. my $número_letras_e      = $palabras[0] =~ tr/e//;
  9. my $número_letras_é      = $palabras[0] =~ tr/é//;
  10. my $número_otras_vocales = $palabras[0] =~ tr/aiouáíóúü//;
  11.  
  12. if ($número_letras_e      == 1
  13. and $número_letras_é      == 1
  14. and $número_otras_vocales == 0
  15. ) {
  16.     say "Encontrado";
  17. }
  18.  
  19. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
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: Ayuda expresiones regulares: nº carac. en una palabra

Notapor aremaku » 2012-04-15 14:07 @630

¡Ups!, me despisto mucho con '@' y '$'.

He probado a añadirle al documento: "use open qw<:utf8 :std>;" y ahora va perfecto. Claro que es comprensible que también halla que tener cuidado con los archivos que se leen en qué codificación estén.

Muchas gracias por la ayuda.

Saludos.
aremaku
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-04-14 11:54 @537


Volver a Básico

¿Quién está conectado?

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