13305 – UPF - Lingüística
Probablement les respostes a les teves preguntes estan aquí. Llegeix fins al final abans de començar a fer res!!
Expressions
Regulars (ER) és el nom
d’una notació estàndard per definir seqüències o cadenes de caràcters. Més exactament:
definim, en donar uns patrons, un conjunt de cadenes. És a dir,
especifiquem característiques que volem que siguin restriccions per seleccionar
de tot el conjunt possible de cadenes de caràcters, aquelles que volem. Amb
ER’s podem dir: “seleccioni o trobi totes les seqüències de caràcters que
tinguin ‘zx’”, per exemple. Aquestes restriccions són el que es diu un patró.
I els resultats, aquelles cadenes que efectivament tenen les característiques que
volíem, és el conjunt de cadenes definit per la ER.

Per usar ER,
però, hem de tenir en compte que en un text digital hi ha caràcters que es
veuen i caràcters que no, però que tots estan codificats. Les ER permeten fer
referència a tot el rang de possibles caràcters:
(1) Caràcters
alfabètics: De la A a la Z com a lletres majúscules i com a lletres minúscules,
que són codis diferents per a tot tipus de programes. Quan volem referir-nos a
totes les lletres de l’abecedari podem escriure, com a drecera de notació,
[A-Z] si ens volem referir a totes les lletres de l’abecedari en majúscules, o
[a-z] a totes en minúscules. També hem de fer atenció als caràcters que no
corresponen a l’abecedari anglès i que poden haver de especificar-se a més a
més. [a-záéíóúñ] seria tot el rang necessari per trobar qualsevol lletra
minúscula del castellà, per exemple. Pensa, quin seria el rang per treballar català.
(2) Caràcters
numèrics: De 0 a 9, o com hem definit abans el rang: [0-9]
(3) Caràcters per
a puntuació: punt (.), coma (,), punt i coma (;), etc. que són els visibles, i
els caràcters de puntuació no visibles i als quals ens podem referir amb un
codi especial:
\n salt de línia
\t tabulador
\r retorn de carro manual
\f “form feed”
Per referir-nos a
tots aquests caràcters de puntuació que no es veuen juntament amb l’espai,
tenim també una notació abreviada que és \s
ER es un llenguatge formal i per
tant té el seu vocabulari, la seva sintaxi i la seva semàntica. Aquest
llenguatge té una sintaxi simple però amb la qual es poden construir
expressions molt complexes que defineixen un conjunt força variat d’elements.
L’expressió regular més senzilla és
una seqüència de caràcters. Per exemple, /responsable/. L’expressió regular es marca amb aquestes barres
inclinades i el que hi posem entre elles són les restriccions que ha d’executar
un programa que entengui així que estem expressant una expressió regular. Si en
un programa donéssim l’ordre de buscar aquesta expressió /responsable/ ens trobaria totes les seqüències que
contenen aquesta, és a dir, per exemple, les següents paraules:
responsable
responsables
responsablement
Però també ens trobarà coses com
ara:
irresponsable
irresponsables
irresponsablement
Fixeu-vos que, per evitar-ho, podem
escriure una expressió com ara / responsable/, on el primer caràcter de l’expressió és un espai en blanc, que significa
literalment que l’únic caràcter que pot haver davant del caràcter ‘r’ és un
espai en blanc.
Però el que realment és interessant
de les ER és que, gràcies als seus operadors, podem
construir expressions complexes que ens permeten definir conjunts molt
específics de seqüències, per exemple, definir el conjunt de les coses que són
paraules. Primer hem de saber com podem definir aquest conjunt i desprès podem
expressar-ho en el llenguatge de les Expressions Regulars..... Anem a pams.
IDENTIFIQUEM
PARAULES
Partirem de les dades de l’exercici
anterior per identificar paraules. Ara definirem la tasca que volem que
realitzi el nostre programa. L’entrada és un text (en format ‘txt’), la tasca és
identificar unitats que anomenem ‘paraules’ i volem que el resultat sigui el
text on cada unitat identificada, cada paraula, estigui en una línia.
A l’exercici anterior havíem descrit ‘com’ podríem resoldre la tasca amb
instruccions com, per exemple, identifica “la seqüència de caràcters que està
entre dos espais en blanc”. Aquesta restricció l’expressaríem de la següent
manera amb les ER:
(1) / [a-zA-Zàéèíòóúç·] /
Fixeu-vos que
entre la barra inclinada i el claudàtor ‘[‘
hi ha un espai en blanc, i significa ‘literalment’ que el patró conté un
espai en blanc. Fixeu-vos a més a més, que en usar l’operador
‘[ ]’, el claudàtor, per marcar un rang, ‘qualsevol caràcter alfabètic, en
minúscules o majúscules’, hem afegit també els caràcters de les vocals
accentuades i dels caràcters consonàntics que no té l’anglès.
Però amb la
instrucció (1) estem definint que entre els dos espais en blanc ha d’haver un únic
caràcter, que pot ser qualsevol dels que hem indicat. I no és això, oi? Per
marcar que estem buscant 1 o més caràcters d’aquest possible tipus, en
un nombre il·limitat, usarem l’operador ‘+’.
(2) / [a-zA-Zàéèíòóúç·]+ /
EXECUTEM ACCIONS:
el comandament substituir
Ara usarem les expressions regulars per donar-li ordres al segmentador:
un programa que identificarà paraules segons les instruccions que nosaltres li
donem en forma de ER. Hem preparat un programa (escrit en un llenguatge de
programació, perl) que executarà les accions de cerca i selecció que li
demanem. Aquest programa és el fitxer anomenat ‘SEGMENTADOR.PRL’. A més a més,
li podem demanar que executi ordres d’acció com ara la de posar cada unitat
identificada en diferents línies. Així que si usem l’expressió regular a (3),
on s/ vol dir ‘substituir’, sobre un text ens ha de
trobar aquesta seqüència.
(3) s/ /\n/g;
Fixeu-vos primer
en les barres inclinades a la dreta ‘/’. Són les que separen les diferents
accions.
(4)
s/ /\n/g;

s/ /\n/g;

El significat de
tota l’expressió és: “substitueix cada
espai en blanc que trobis per un caràcter de salt de línia”.
(5)
s/ /\n/g;
Encara ens falta
explicar una cosa, però. La ‘g’, vol
dir que ho faci de forma general, tants cops com vegades trobi el patró. Aquest
modificador de la ER és necessari per distingir quan volem que faci
l’acció una sola vegada, la primera que trobi el patró, o volem que la faci
tantes vegades com pugui. El ‘;’ diu
que hem acabat aquesta expressió.
Recordeu:
1) L’expressió regular de cerca es troba a la primera part de la instrucció
que li donem al SEGMENTADOR, el primer espai entre barres inclinades.
2) Estem usant les ER per trobar patrons i substituir-los. Per això, en el
segon espai entre barres inclinades hem de posar per a quina cosa volem que
sigui substituït allò que ha trobat. En l’exemple hem dit que substitueixi els
espais en blanc per un caràcter de salt de línia. Quan imprimeixi aquest
caràcter imprimirà un salt de línia i la paraula següent es s’imprimirà en una
altra línia.
3) Després de la darrera barra inclinada, la ‘g’ indica que repeteixi l’acció tants cops com
trobi el patró. En el nostre exemple això voldrà dir tots els espais en blanc.
4) NO ens hem d’oblidar del ‘;’ final. El nostre programa necessita aquesta
marca per entendre que hem acabat una instrucció
Mireu un altre
exemple. En aquest cas veurem una altra característica interessant de les
expressions regulars.
De la nostra
llista d’instruccions per identificar paraules, de ben segur que hem tingut en
compte que no totes les paraules estan entre espais en blanc. També n’hi ha que
en lloc d’un espai tenen un signe de puntuació. (‘puntuació.’ és un bon
exemple). Ara hem de decidir què volem fer amb aquest signe de puntuació. Si
decidim de tractar-lo com un signe lingüístic més i posar-lo en una línia
separada, podem fer el següent:
(6)
s/\./\n\.\n/g;
Amb aquesta
instrucció diem: “Substitueix cada caràcter ‘punt’ (fixeu-vos que usem la barra
inclinada ‘\’ per referir-nos al caràcter i no a l’operador ‘.’ que vol dir
‘qualsevol caràcter’ per:
-
un de ‘salt
de línia’,
-
un caràcter
‘punt’ i
-
un de ‘salt
de línia’”
Com que hi ha més
signes de puntuació que poden anar enganxats darrera les paraules, hauríem de
fer una instrucció per a cada un d’ells o bé posar-los tots entre claudàtors
per tal d’expressar que pot ser un de tots els que posem a la llista:
(7)
s/[.,!?:;]/
(Aquí no caldrà
marcar amb la barra ‘\’ ja que l’operador de rang ‘[]’ ho deixa clar, i ull,
que me n’he deixat alguns...) Però ara, per qual el substituïm? El que voldríem
és que si ha trobat un punt, el substitueixi per un punt, i si era una coma, per
una coma, etc. Les Expressions Regulars permeten usar ‘variables’, és a dir,
elements el valor dels quals es determina quan s’està processant. La instrucció
que donaríem es podria llegir com “substitueix qualsevol d’aquests signes que
puguis trobar, per salt de línia i el signe que has trobat efectivament”. Usem
‘$1’, el dòlar per marcar que és una
variable, i el nombre per identificar diferents variables. Per marcar el
referent de la variable usem els parèntesis:
(8)
s/([.,!?:;,])/\n$1/g;
Ara que ja sabem
expressar-nos, podem passar a construir el segmentador....