Usuari:Amical-bot/Manuals/Expressions regulars

De la Viquipèdia, l'enciclopèdia lliure

Tècnicament les pàgines d'expressions regulars es poden guardar a qualsevol lloc, però es recomana que creeu una subpàgina del mateix Usuari:Amical-bot (per exemple: Usuari:Amical-bot/Matemàtiques/fr) on quedi clar el tipus d'articles pels que són adequades les expressions que heu creat. També convé afegir-hi un enllaç intern a la pàgina d'usuari a la secció pàgines d'expressions regulars, així qualsevol altre usuari les podrà localitzar facilment i fer-les servir.

Si es tracta d'un joc d'expressions regulars molt personalitzat al vostre estil o les esteu provant, les podeu guardar en una subpàgina de la vostra pròpia pàgina d'usuari.

Per indicar quina és la pàgina ER que voleu emprar, a la plantilla de petició de traducció automàtica, heu de indicar el títol de la pàgina on heu escrit aquestes ER

El motiu per que no n’hi hagi una de comú per a totes les traduccions d’un idioma determinat és que es pot millorar molt més la traducció tractant de forma diferent els articles de cada àmbit temàtic. Moltes expressions demanen una traducció diferent en funció del context.

De fet hi ha una pàgina comú a totes les traduccions de totes les llengues que s’aplica sistemàticament, però manipular aquesta pàgina té efectes en totes les traduccions i podria aturar el funcionament del bot. Si penseu que hi ha alguna ER que es pugui aplicar de forma generalitzada independent del context, si us plau deixeu un missatge a la pàgina de discussió de robot i els seus administradors la afegiran.

També hi ha una pàgina que és la que es fa servir per omissió per cada idioma en cas que no se'n indiqui cap. Aquestes pàgines contenen elements molt bàsics i les podeu copiar en iniciar una pàgina nova. les podeu trobar a Usuari:amical-bot/er-omissió/id on id són les sigles del codi del idioma.

Les expressions regulars les fa servir en una ordre que fa cerca i substitució. Per això en la pàgina ER heu de ficar expressions en parelles. La primera indica què és el que s’ha de cercar i la segona explica com es construeix el resultat que ha de substituir el que s’ha trobat.

Sintaxi[modifica]

La pàgina d'expressions regulars té tres tipus de continguts: Text comentari, expressions regulars, missatges de l'amical-bot.

Les expressions regulars són parelles de línies consecutives que comencen per un “*”.

Qualsevol altre cosa es considera un comentari i és ignorat per l'amical-bot. Serveix únicament per que vosaltres pugueu explicar que fa cada expressió regular.

Si l'amical-bot detecta una expressió regular que no és correcta afegirà un missatge al peu de la pàgina on dirà quina és. El conjunt d'aquest missatges formen una llista que el propi bot mira per tal de no repetir missatges. No els elimineu si no és que heu modificat l'expressió i creieu que el problema està arreglat.

Una primera aplicació elemental consisteix simplement en fer una cerca i substitució de cadenes de caràcters, per exemple:

  • enter relatiu
  • enter

Això serveix per corregir un error típic en les traduccions de matemàtiques del francès al català. En francès els nombres enters es diuen nombres entiers relatifs però el traductor automàtic tradueix entier relatif per enter relatiu no per enter com hauria de ser.

Amb aquest única aplicació podeu millorar molt les traduccions en àmbits concrets i molta gent pot ser que no necessiti res mes.

Grups[modifica]

Però les expressions regulars ofereixen molta més potència. Una primera eina és la possibilitat de reutilitzar una part del text trobat en el text a substituir. Per exemple per canviar l’ordre de les paraules:

  • (la) (rosa) (casa)
  • \1 \3 \2

La cadena “(la) (rosa) (casa)” és una expressió regular que troba tots els llocs on apareix en el text la cadena “la rosa casa”. Fixeu-vos que no en fa cas dels parèntesis. Els bocins entre parèntesis són grups que es poden reutilitzar. Llavors ”\1 \3 \2” reutilitza aquests grups, \1 fa referència al grup del primer parèntesis “la”, i així sucessivament. Entre el \1 i el \2 i ha un espai, per tant s’hi inserirà. El resultat serà que a tot arreu on hi aparegui “la rosa casa” se substituirà per “la casa rosa”.

Cadenes variables[modifica]

L’ús dels grups no tindria gaire interès si no fos que el contingut de cada bocí pot ser variable i desconegut a priori.

Per exemple, al traduir del francès, sempre que apareix: “en 1958”, o “en 2009” o .... “en (un any qualsevol)”, és una mala traducció que hauria d’haver donat “el 1958” ...

La següent expressió ho arregla:

  • en (\d\d\d\d)
  • el \1

Aquí “\d” vol dir: “qualsevol nombre decimal”. De fet la ER es pot interpretar com un patró que encaixa amb una cadena de caràcters si la cadena compleix els requisits que es descriuen en el patró. La ER “en (\d\d\d\d)” és un patró on encaixen totes les cadenes que comencin amb “en ” (fixeu-vos que darrere de la “n” hi ha un espai en blanc que també conta) i estiguin seguides per qualsevol xifra formada per quatre nombres decimals.

Com que els quatre nombres decimals estan encerclats pel primer parèntesi (i en aquest cas únic) de la ER, es poden reutilitzar en la substitució. Llavors la substitució de cada cadena trobada per “el \1” provoca que en el lloc on hi havia “en 1958” es substitueixi per “el 1958” i on hi havia “en 2009” per “el 2009”.


Conjunts de caràcters[modifica]

\d és un conjunt de caràcters que ve predefinit i serveix per definir el patró de forma que només hi encaixin les cadenes que tenen un nombre decimal en la posició on apareix el \d. Hi ha més conjunts predefinits i es poden definir conjunts ad hoc.

Per exemple, pot interessar que l’expressió també funcioni en cas que estigui al començament d’un línia i per tant la lletra inicial sigui majúscula. Tal com estava definida, no “encaixaria” i quedaria com estava sense substitució. La següent ER ho arregla:

  • [eE])n (\d\d\d\d)
  • \1l \2

Aquí s’ha escrit [eE] això defineix un conjunt de caràcters que té dos membres: “e” i “E”, indica que una cadena encaixa amb el patró si:

  1. El primer caràcter és “e” o “E”.
  2. Els caràcters segon i tercer són “n “ (fixeu-vos amb l’espai que també compta).
  3. Els quatre últims caràcters són quatre dígits.

El primer caràcter s’ha encerclat entre parèntesis, això farà que estigui disponible en la substitució així la cadena de substitució ”\1l \2” ficarà una còpia del primer caràcter de la cadena original. D’aquesta forma si era minúscula o majúscula es conservarà. Ara el nombre del any correspon a la etiqueta \2 perquè en encerclar en parèntesi el primer caràcter el \1 li correspon a aquest.

Entre els claudàtors es pot posar la llista de caràcters que conté el conjunt que s’està definint, però per definir un conjunt de caràcters hi ha més potència:

  • [c1- c2] defineix el conjunt de tots els caràcters compresos entre c1 i c2 ambdós inclosos. Per exemple [A-Z] defineix el conjunt de totes les lletres majúscules o [0-9] vol dir el mateix que \d. Compte que els caràcters estan ordenats d’acord amb la llista ASCII o Uencode.
  • El símbol “^” al començament vol dir el conjunt complementari. Així [^A-Z] vol dir tots els caràcters que no siguin lletres majúscules.

Conjunts predefinits[modifica]

Igual com en l’exemple es fan servir \d per fer referència al conjunt de tots els dígits decimals. Hi ha més conjunts predefinits que es poden emprar en les expressions regulars:

  • . Qualsevol caràcter tret d’un salt de línia.
  • \n Un salt de línia.
  • \d Qualsevol dígit decimal
  • \D Qualsevol caràcter que no sigui un dígit decimal
  • \s Qualsevol espai en blanc: espai o tabulador o salt de línia...
  • \S Qualsevol caràcter que no sigui un espai en blanc
  • \w Qualsevol caràcter alfanumèric
  • \W Qualsevol caràcter que no sigui alfanumèric.

Cadenes de longitud variable[modifica]

L’expressió que s’ha definit fins ara té l’inconvenient de que només encaixa amb nombres de 4 xifres, per exemple la cadena “en 958” no encaixa i no se substituiria.

Això es pot resoldre amb el següent:

  • [eE])n (\d{3,4})
  • \1l \2

El fet que al darrere del \d hi hagi {3,4} vol dir que el patró encaixa si el dígit es repeteix entre 3 i 4 vegades. Ara encaixen tan “en 859” com “en 1859” i no encaixen “en 59” ni “en 11859”.

La forma de indicar les repeticions en alguns cassos particulars es pot fer de manera simplificada, les següents maneres són equivalents:

  • {0,1} és equivalent a ?. Fixeu-vos que 0 vol dir cap per tant es fa servir per un caràcter opcional, pot ser-hi o no i la cadena continua encaixant.
  • {0,2000000000} és equivalent a {0, } i a *. Es correspon a un nombre de repeticions entre 0 (cap) i gairebé infinit (de fet 2 mil milions).
  • {1,2000000000} és equivalent a {1, } i a +. Es correspon a un nombre pràcticament infinit de repeticions (de fet 2 mil milions) però com a mínim ha d’aparèixer una vegada.

La repetició s’aplica a l’element que hi ha immediatament a l’esquerra. Pot ser un caràcter o un grup de caràcters (tancats entre parèntesi).

En el cas de les repeticions normalment intenta fer-ne tantes com es pugui fins que el patró encaixi (aquest comportament s’anomena golafre). De vegades interessa que el patró encaixi amb el mínim nombre possible (no golafre). Per indicar això cal fiar un “?” desprès de la repetició.

Patró A o patró B[modifica]

De vegades interessa que la cadena encaixi tant si encaixa en un patró donat com si ho fa amb un altre. És a dir hi ha dues formes alternatives possibles.

Per indicar això s’escriuen les dues expressions regulars separades per un caràcter: |

Fer encaixar metacaracters[modifica]

Un problema que no és habitual que trobeu en emprar ERs per millorar les traduccions és el de fer referència als metacaractes.

Per definir una expressió regular s’ha vist que s’escriu una cadena de caràcters, però que n’hi ha alguns que tenen un significat especial.

Per exemple [eE] encaixa amb les cadenes d’un únic caràcter si aquest és una e o una E. Com es pot fer per definir una ER que encaixi amb les cadenes de 4 caracters que són exactament “[eE]”? La següent ER fa això :

\[eE\]

Fixeu-vos que s’ha afegir \ davant de [ i de ], el fet d’afegir una \ davant d’un caràcter fa que s’ignori el seu significat i que es faci servir com un caràcter normal més. El metacracters que poden necessitar això són:

. ^ $ * + ? { [ ] \ | ( )