• Publicidad

Expresiones regulares, AND

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

Expresiones regulares, AND

Notapor otorices » 2009-06-29 02:59 @166

Hola,

¿Es posible meter un AND en una expresión regular? Me explico con un ejemplo:

Supongamos que quiero comprobar que en la variable $var existe la subcadena "si" y "no". Con dos expresiones regulares sería:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($var =~ /si/ && $var =~ /no/)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Se puede simplificar ese "if", haciendo dicha comprobación en una sola expresión regular? Hay que tener en cuenta que podría aparecer el "si" antes del "no" y viceversa.

¡Gracias!
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Publicidad

Notapor explorer » 2009-06-29 03:39 @194

En este caso, como son pocas las combinaciones, se pueden desplegar todas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -le '$_="hola, no hola,y si"; print "SI" if /(?:\bsi\b.*?\bno\b|\bno\b.*?\bsi\b)/'
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor otorices » 2009-06-29 03:58 @207

De acuerdo, pero no se puede poner un AND como tal, ¿verdad?

En este caso he puesto un ejemplo simple, pero en realidad trato casos más complejos, por lo tanto no me sirviría tu solución.

¡Gracias de todas formas!
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Notapor explorer » 2009-06-29 06:21 @306

Me interesa saber cuáles son esos casos. ¿Puedes poner un ejemplo?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2009-06-29 07:54 @371

En realidad sí que se pueden poner condiciones dentro de las expresiones regulares:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#use strict;
use warnings;
use diagnostics;

$_ = "Hola, si y no";

$res = 0;

/\b (si|no) \b .*? \b (si|no) \b (?{ $res = 1 if $1 and $2})/x;

print "[$res]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero es lo mismo que si primero capturamos y luego comprobamos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#use strict;
use warnings;
use diagnostics;

$_ = "Hola, si y no";

$res = 0;

/\b (si|no) \b .*? \b (si|no) \b/x;

$res = 1 if $1 and $2;

print "[$res]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Habría otra posibilidad más, y es usando la extensión "(?(condición)verdadero|falso)", pero es "altamente experimental".

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
#use strict;
use warnings;
use diagnostics;

$_ = "Hola, si y no";

$res = 0;

/\b (si) \b .*? \b (no) \b (?(1)  (?(2) (?{$res = 1}) | (?{$res = 0}))  |  (?{$res = 0}) )/x;

print "[$res]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sería interesante ver un ejemplo real, para ver si se puede atacar el problema de otra forma.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor otorices » 2009-06-29 13:34 @607

Gracias por las respuestas.

El caso es que el ejemplo es bastante complejo, y además le he encontrado una solución más sencilla. Te comento un resumen de lo que pretendía:

Tengo una aplicación que identifica palabras clave que determinan diferentes apartados en unos informes médicos. Al principio, usaba las expresiones regulares dentro del propio programa para identificar los apartados. Por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $linea =~ /ANTECEDENTES/) { #Se ha identificado al apartado "Antecedentes" del informe
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero hay casos en los que la detección de un apartado requiere más "if", ya que existen subapartados. El caso es que quiero mejorar el programa para que en vez de "incrustar" las expresiones regulares en el propio programa, tengo intención de crear un fichero en el que se guarden los nombres de los apartados con su correspondiente expresión regular (una).

Este podría ser su contenido:
Código: Seleccionar todo
...
Antecedentes -> /ANTECEDENTES/
...


Por eso la idea era poder cargar por cada apartado del informe una expresión regular, pero ya encontré la solución.

Gracias.
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Notapor explorer » 2009-06-29 14:10 @632

Ok...

Eso me recuerda algo parecido a los DTD o a los ficheros de definición de los XML... creo, incluso, que hay módulos Perl v5 específicos para crear gramáticas. Y, naturalmente, con Perl v6. Porque de alguna forma es eso: gramáticas.

Por otra parte, por aquí, ya hemos hecho algo relacionado con la medicina y las expresiones regulares.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron