🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #5921

Re: Regexp & Perl: Como sustituir varias palabras parecidas

#5921
From: Samuel
Date: Tue, 02 Sep 2003 06:44
97 lines
3876 bytes
El 1 Sep 2003 15:31:14 -0700, Francesco Moi 
 <francescomoi@europe.com> dijo:
> Hola.
> 
> En Perl, tengo una cadena con un texto, en la que me gustar�a sustituir 
> las palabras 'programacion', 'programa' o 'programador' por 'program'.
> 
> Con esta RegExp funciona:
> $texto =~ s/programador|programa|programacion/program/g;
> 
> Pero como son palabras muy parecidas, pensaba que se podr�a hacer
> mucho m�s facil, como por ejemplo:
> $texto =~ s/program[ador,a,cion]/program/g;
> $texto =~ s/program[ador|a|cion]/program/g;
> 
> Pero ninguna de las dos funciona. �Alguien sabe como hacer m�s corta
> la RegExp, si es que se puede?
> 
> Gracias, y un saludo.

Creo que no has entendido como funciona el []. Pero tu mismo te puedes
dar cuenta depurando la expresi�n regular. Veamos:

1) Primer caso (Bueno)

$  perl -e  'use re 'debug'; \
 $texto =~ s/programador|programa|programacion/program/g;'

Compiling REx `programador|programa|programacion'
size 15 
   1: BRANCH(6)
   2:   EXACT <programador>(15)
   6: BRANCH(10)
   7:   EXACT <programa>(15)
  10: BRANCH(15)
  11:   EXACT <programacion>(15)
  15: END(0)
minlen 8 

2) Segundo caso

$  perl -e  'use re 'debug'; $texto =~ s/program[ador,a,cion]/program/g;'
Compiling REx `program[ador,a,cion]'
size 13 first at 1
   1: EXACT <program>(4)
   4: ANYOF[,acdinor](13)
  13: END(0)

Esto no es lo que quieres

3) Tercer caso
$ perl -e  'use re 'debug'; $texto =~ s/program[ador|a|cion]/program/g;'
Compiling REx `program[ador|a|cion]'
size 13 first at 1
   1: EXACT <program>(4)
   4: ANYOF[acdinor|](13)
  13: END(0)

Esto tampoco.

Como ves [] simplemente define una clase de *caracteres*, igual que lo
es \w o \d. Eso no te vale. Lo que necesitas es:

$ perl -e  'use re 'debug'; $texto =~ s/program(ador|a|acion)/program/g;'
Compiling REx `program(ador|a|acion)'
size 18 first at 1
   1: EXACT <program>(4)
   4: OPEN1(6)
   6:   BRANCH(9)
   7:     EXACT <ador>(16)
   9:   BRANCH(12)
  10:     EXACT <a>(16)
  12:   BRANCH(16)
  13:     EXACT <acion>(16)
  16: CLOSE1(18)
  18: END(0)

O si quieres coger tambi�n programadores, programatico, etc...:
$ perl -e  'use re 'debug'; $texto =~ s/program[a-zA-Z]*?/program/g;' 
Compiling REx `program[a-zA-Z]*?'
size 15 first at 1
   1: EXACT <program>(4)
   4: MINMOD(5)
   5: STAR(15)
   6:   ANYOF[A-Za-z](0)
  15: END(0)

Puedes echarle un vistazo tambi�n, por si tienes dudas a las p�ginas man
perlre y perlretut.

Saludos

Samuel

-- 
Samuel Mo�ux Salvador
PGP Key pgp.rediris.es    -----         KeyID 0x822583C2
Technical Details
Message-ID: <slrnbl8f1v.ks.444398NOSPAM@tizona.no-ip.org>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!cyclone.bc.net!tdsnet-transit!newspeer.tds.net!news-out1.nntp.be!propagator2-sterling!news-in-sterling.nuthinbutnews.com!nsnmrro1-lo.nuria.telefonica-data.net!nsnmrro2-lo.nuria.telefonica-data.net!not-for-mail
References: <5b829932.0309011431.6fff8097@posting.google.com>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,568a4d84eb300bba
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2003-09-01 23:44:27 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!cyclone.bc.net!tdsnet-transit!newspeer.tds.net!news-out1.nntp.be!propagator2-sterling!news-in-sterling.nuthinbutnews.com!nsnmrro1-lo.nuria.telefonica-data.net!nsnmrro2-lo.nuria.telefonica-data.net!not-for-mail
From: Samuel <444398NOSPAM@celes.unizar.es>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Regexp & Perl: Como sustituir varias palabras parecidas
Date: Tue, 2 Sep 2003 06:44:17 +0000 (UTC)
Organization: Telefonica Data Espagna
Lines: 97
Message-ID: <slrnbl8f1v.ks.444398NOSPAM@tizona.no-ip.org>
References: <5b829932.0309011431.6fff8097@posting.google.com>
NNTP-Posting-Host: 165.red-80-25-246.pooles.rima-tde.net
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: nsnmrro2-gest.nuria.telefonica-data.net 1062485057 22832 80.25.246.165 (2 Sep 2003 06:44:17 GMT)
X-Complaints-To: usenet@nsnmrro2-gest.nuria.telefonica-data.net
NNTP-Posting-Date: Tue, 2 Sep 2003 06:44:17 +0000 (UTC)
User-Agent: slrn/0.9.7.4 (FreeBSD)