Microsoft Word - Laborator 6 - Expresii Regulate IV.doc

Documente similare
Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Adresarea memoriei Modurile de adresare constituie un instrument principal pentru reprezentarea în memorie a imaginii datelor, aşa cum este ace

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

Subiectul 1

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Информационная система персонализации, печати и учета документов об образовании

E_d_Informatica_sp_SN_2014_bar_10_LRO

Aggregating Data

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

Microsoft Word - Algoritmi genetici.docx

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Paradigme de programare

Microsoft Word - 2 ES RO.doc

Creational design patterns

Communicate at your best - Manual - Cap 3 - RO

Programarea şi utilizarea calculatoarelor

Mic ghid de folosire a Gmail

GET Moldova_PB _ro [Kompatibilitätsmodus]

proiectarea bazelor de date

Informație și comunicare

Microsoft Word - PI-L7r.doc

Limbaje de Programare Curs 8 – Fisiere

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Judetul Tulcea

Microsoft Word - CarteC.doc

Microsoft Word - IA2-Lisp-stud.doc

Microsoft Word - Evaluare_initiala_Matematica_Cls07_Model_Test.doc

tehnologii web

Paradigme de Programare

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Laborator 3

Astfel funcționează portalul KiTa Dortmund În 3 pași către locația de îngrijire copii Portalul KiTa Dortmund poate fi oper

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

Microsoft Word - lab-fr_3

Capitole Speciale de Informatică Curs 2: Determinarea vocabularului de termeni şi a listelor de postări 4 octombrie 2018 Reamintim că listele de indec

Layout 1

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea

Microsoft Word - Power Grid tradus.doc

Microsoft Word - CarteC.doc

Laborator 1-Teoria probabilitatilor si statistica matematica Sef lucrari dr.mat. Daniel N.Pop Departamentul de calculatoare si inginerie electrica 1 P

Microsoft PowerPoint - DOSARUL PENTRU VALIDAREA UNEI CALIFICARI.ppt [Read-Only]

Microsoft Word - Fisa-Informatica-CH-2014.doc

REGULAMENTUL Concursului SMS Eurovision 2013 Hai cu noi în Suedia! Prezentul Regulament stabileşte principiul de desfăşurare a Concursului Eurovision

B

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Modul Modbus ASCII SISTEME DE COMUNICATIE CURS 5 - Constantinescu Catalin Atunci cand se foloseste modul MODBUS ASCII fiecare octet din mesaj

Microsoft Word - lab_access.doc

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

E_d_Informatica_sp_MI_2015_bar_02_LRO

EN_IV_2018_Limba_romana_Test_1

-

EXCEL FĂRĂ SECRETE Grafice şi diagrame

Capitole Speciale de Informatica - Curs 5: Extragerea informatiilor prin feedback de relevanta. Metode probabiliste de extragere a informatiilor

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

COMENTARII FAZA JUDEŢEANĂ, 9 MARTIE 2013 Abstract. Personal comments on some of the problems presented at the District Round of the National Mathemati

Omagiu pentru Vasarely, Soto și Tinguely Omagiu pentru Vasarely, Soto și Tinguely Cinci tineri artiști s-au mutat la Uzina de la Mioveni, România. Tim

1

Cum sa te imprietenesti cu Google Introducere Povestea acestei carti a inceput in urma cu putin timp cand am participat la conferinta Treptele schimba

Manual de utilizare a Sistemului Informațional al Institutului Național al Justiției (SI INJ) intranet.inj.md Ver.2 Manual de utilizare a Sistemului I

Diapositive 1

PHP (II)

Microsoft Word - 1-Introducere.doc

CONSTIENT Marius Chirila

Ghid de utilizare pentru Platforma E-Admitere intranet.inj.md

Microsoft Word - ilis_sociologia_lect.doc

Programarea calculatoarelor. Note de curs Marius Minea 1 Introducere în programarea în C 1.1 Funcţii în limbajul C Calcule şi funcţii La origine, rolu

LB LATINA CP CEIA

Microsoft Word - Programa_Evaluare_Nationala_2011_Matematica.doc

Cursul 12 (plan de curs) Integrale prime 1 Sisteme diferenţiale autonome. Spaţiul fazelor. Fie Ω R n o mulţime deschisă şi f : Ω R n R n o funcţie de

Microsoft Word - V_4_Inmultirea_nr_nat.doc

REGULAMENTUL Concursului SMS Primăvara Ta 1. DEFINIȚII Prezentul Regulament stabileşte principiul de desfăşurare a Campaniei Primăvara Ta, precum şi p

I. INTRODUCERE 1. Necesitatea studiului logicii Teodor DIMA În activitatea noastră zilnică, atunci când învăţăm, când încercăm să fundamentăm o părere

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

... MANAGER SERVICE UTILAJE - Aplicatie software pentru gestiune service utilaje - MANUALUL UTILIZATORULUI OFERTE Folositi acest meniu daca dori

Slide 1

CABINET MINISTRU

Microsoft Word - Titlu VICod Fiscal Comparativ final.doc

Metode de sortare - pregătire admitere - Conf.dr. Alexandru Popa Lect. dr. Andrei Pătraşcu Universitatea din Bucureşti 1

Utilizare Internet

Ghidul in materie de fete pentru baieti:Layout 1.qxd

Gestiunea serviciilor de recuperare a sănătăţii în sanatorii şi preventorii


Laboratorul numarul 6 Reglarea turaţiei motorului asincron prin variația frecvenței de alimentare cu păstrarea raporului U/f constant Expresia turaţie

PowerPoint-Präsentation

subiecte clasa7

INSTITUTUL DE DEZVOLTARE A SOCIETĂŢII INFORMAŢIONLE

Microsoft Word - Conventia matrimoniala.doc

Analiză statică Analiza fluxului de date 23 octombrie 2014

客厅电脑 酷影Q1000

Top

Capitole Speciale de Informatică Curs 4: Calculul scorurilor în un sistem complet de extragere a informaţiilor 18 octombrie 2018 Reamintim că în cursu

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

CARTEA BEBELU{ULUI FERICIT CORINT UTILIS CUM S -}I CRE{TI COPILUL CU ÎNCREDERE {I CALM GINA FORD Cea mai bine vândută autoare britanică de cărţi desti

Lucrarea 7 Filtrarea imaginilor BREVIAR TEORETIC Filtrarea imaginilor se înscrie în clasa operaţiilor de îmbunătăţire, principalul scop al acesteia fi

C2 25 aprilie Conversatii cu Dumnezeu vol 4.indd

Limbaje de Programare Curs 5 – Siruri de caractere

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Detectivii Apei Pierdute

Transcriere:

PERL Laborator 6 Adrian Iftene Martie 26, 2007 1

1 Greşeli Comune când lucrăm cu RegExp... 3 2 Câteva Subiecte mai Avansate... 3 2.1 Comentarii Inline... 4 2.2 Modificatori Inline... 4 2.3 Gruparea fără Backreferences... 5 2.4 Căutări după şi înainte... 6 2.5 Backreferences (din nou)... 8 3 Concluzii... 9 4 Probleme de antrenament... 9 4.1 Modificatori Inline... 9 2

1 Greşeli Comune când lucrăm cu RegExp Sunt câteva greşeli comune pe care oamenii tind să le facă când lucrează cu expresii regulate. Am văzut că /a*b*c*/ se va potri pe orice şir, chiar dacă fiecare literă se potriveşte de zero ori. Ce altceva putem greşi? Să uităm să grupăm literele /Tam{2}/ se va potrivi cu Tamm, în timp ce /(Tam){2}/ se va potrivi cu TamTam, deci să fim atenńi atunci când alegem una din ele. Acelaş lucru pentru alternative: /Simplu pe/ se va potrivi cu Simplu şi cu pe, în timp ce /Sim(plu pe)/ se va potrivi cu fiecare din Simplu şi Simpe separat. Punerea greşită a ancorelor ^ se foloseşte la început, şi $ la sfârşit. Un dolar în orice altă parte din şir va conduce la încercarea de interpolare cu o variabilă. Să uităm să sărim peste caracterele speciale Dorim să le folosim cu înńelesul lor special? Trebuie să fim atenńi la următoarele caractere:. *? + [ ] ( ) { } ^ $ şi bineînńeles chiar \. Ne-numărarea de la zero Să nu uităm că intrarea într-un şir e dată de pozińia zero. Numărarea de la zero Cu toate că de regulă numărătoarea se face de la zero la backreferences începe de la $1. Asta deoarece Perl foloseşte o caracteristică dintr-un limbaj awk care foloseşte ca $1 referinńa către prima variabilă. 2 Câteva Subiecte mai Avansate Până acuma nu am intrat mai în adâncul sintaxei expresiilor regulate Perl-ul are obiceiul de a adăuga caracteristici neconvenńionale, chiar bizare uneori bazându-se pe anumite reguli. Toate extensiile încep cu un semn de întrebare într-un grup aceasta face să ne oprim şi să ne întrebăm: Chiar dorim să facem asta? Câteva din acestea sunt experimentale şi pot diferi de la o versiune la alta de Perl (şi e posibil ca ele să dispară la un moment dat). Câteva din ele sunt foarte utile şi le vom urmări în continuare. 3

2.1 Comentarii Inline Deja am văzut cum putem folosi modificatoul /x pentru a adăuga comentarii şi spańii albe expresiilor noastre regulate. Putem să facem asta cu şablonul (?#): /^Astazi (?# Aceasta parte este ignorata) suntem in data:/ Din păcate, nu avem nici o posibilitate să avem paranteze în interiorul acestor comentarii, şi Perl va închide comentariul la prima paranteză închisă. 2.2 Modificatori Inline Dacă citim şabloane dintr-un fişier sau le construim din interiorul codului nostru, nu avem nici o modalitate de a adăuga un modificator la sfârşitul operatorului expresiei regulate. De exemplu: #!/usr/bin/perl #inline.plx use warnings; use strict; my $sir = Avem mai mult de o Modalitate de a face asta! print Introduceti o expresie de test: ; my $sablon = <STDIN; chomp($sablon); if ($sir = ~ /$sablon/) { print Felicitari! $sablon se potriveste pe sir.\n ; } else { print Ne pare rau. Nici o potrivire pentru $sablon.\n ; } Dacă rulăm acest program şi uităm modul în care era capitalizat şirul nostru, vom obńine: perl inline.pl Introduceti o expresie de test: o modalitate de a face asta! Ne pare rau. Nici o potrivire pentru o modalitate de a face asta!. 4

Cum putem să facem aceasta să fie case-insensitive? SoluŃia este să folosim un modificator inline cu sintaxa (?i). Aceasta va face să avem potrivire case-insensitive. Prin urmare vom avea: perl inline.pl Introduceti o expresie de test: (?i)o modalitate de a face asta! Felicitari! (?i)o modalitate de a face asta! se potriveste pe sir. Dacă, invers, avem un modificator în locul în care dorim să scăpăm temporar de acest lucru, putem folosi, de exemplu, (?-i). Dacă avem: /Avem mai mult de o ((?-i)modalitate) de a face asta!/i; doar cuvântul Modalitate va fi potrivit case-insensitive. De notat că putem folosi de asemenea modificatorii: /m, /s şi /x în acelaşi mod. 2.3 Gruparea fără Backreferences Parantezele ajută în gruparea şi popularea variabilelor backreferences. Dacă avem o porńiune a potrivirii noastre în paranteze, aceasta va fi, în caz de succes, plasată în una din variabilele numerotate. Totuşi, e posibil ca în anumite situańii să dorim să folosim paranteze pentru grupare. De exemplu, ne aşteptăm ca prima backreference să conńină ceva important, dar putem să avem alt text în apropiere. Putem avea ceva după cum urmează: /(X-)?Topica: (\w+)/; Nu putem fi siguri dacă prima noastră backreference va fi în prima sau în a doua ($1 sau $2) asta va depinde de faptul că X- este prezentă sau nu. De exemplu, dacă avem şirul Topica: vremea, vom vedea că $1 este nedefinită. Dacă vom încerca să facem ceva cu variabila $1, vom primi un mesaj de avertizare deoarece variabila nu a fost inińializată: Use of uninitialized value in concatenation Aceasta nu este neaparat o problemă. După toate acestea vom găsi cuvântul nostru în $2 dacă avem ceva după Topica: bineînńeles. E suficient să fim atenńi să nu folosim variabila $1? Dar ce se întâmplă dacă avem mai mult de un câmp opńional? Să presupunem că avem o expresie cu 2 până la 6 grupuri opńionale. E posibil să avem în $2 primul nostru cuvânt şi de abia în $6 al doilea, în timp ce $1, $3, $4 şi $5 rămân nedefinite. Acesta desigur nu este un exemplu bun de programare şi conduce spre diferite probleme. Prin urmare, nu va trebui să folosim câmpuri backreference dacă nu este neaparată nevoie. Putem rezolva această problemă foarte uşor, prin adăugarea caracterelor?: ca mai jos: 5

/(?:X-)?Topica: (\w+)/; Aceasta ne va asigura că primul pereche de paranteze este doar un grup şi nu vom avea o valoare corespunzătoare într-o variabilă backreference. Cuvântul nostru va fi pus întotdeauna în $1. 2.4 Căutări după şi înainte Uneori e posibil să dorim ca pe o anumită linie să înlocuim cuvântul peste cu tort, dar numai dacă următorul cuvânt este frisca. Putem să facem asta foarte simplu, spunând: s/peste frisca/tort frisca/ Ce se întâmplă? Motorul expresiilor regulate caută şirul referinńă, cautând peste frisca. Dacă găseşte unul, îl va înlocui cu textul tort frisca. Am obńinut ceea ce doream. În acest caz nu e aşa complicat să înlocuim şapte caractere din fiecare potrivire cu alte şapte caractere identice (ne referim la partea comuna frisca ). Nu e greu de văzut că această metodă este ineficientă şi poate produce adevărate probleme într-un program în care folosim excesiv substituńia. Ce dorim să facem: să găsim o cale să precizăm într-o potrivire avem potrivirea textului numai dacă cuvântul următor este frisca. Având potrivire pe cuvântul peste, vom căuta după să vedem dacă avem frisca în continuare (şi avem potrivire dacă acesta există, şi vom înlocui cu tort ), dacă nu mergem mai departe fără a mai face înlocuirea. În Perl acest lucru este foarte uşor, deoarece avem un operator special pentru astfel de lucruri: /peste (?= frisca)/ care face exact ce dorim se uită după peste, după care cauta frisca în continuare, şi returnează potrivire numai dacă această a doua potrivire reuşeşte de asemenea. De exemplu: #!/usr/bin/perl #cautare.plx use warnings; use strict; $_ = peste frisca si peste marinat ; print Comanda noastra initiala a fost, $_, \n ; s/peste(?= frisca)/tort/; print Acuma, am schimbat-o in, $_, \n ; 6

ne va returna: perl cautare.pl Comanda noastra initiala a fost peste frisca si peste marinat Acuma, am schimbat-o in tort frisca si peste marinat Putem de asemenea să ne uităm să nu urmeze ceva anume, folosind un semnul mirării în locul semnului de egalitate: /peste(?! frisca)/ care va întoarce potrivire pentru peste doar dacă cuvântul următor nu este frisca. Dacă vom modifica programul de mai sus după cum urmează: #!/usr/bin/perl #cautare2.plx use warnings; use strict; $_ = peste frisca si peste marinat ; print Comanda noastra initiala a fost, $_, \n ; s/peste(?! frisca)/tort/; print Acuma, am schimbat-o in, $_, \n ; ne va returna: perl cautare2.pl Comanda noastra initiala a fost peste frisca si peste marinat Acuma, am schimbat-o in peste frisca si tort marinat Căutările înainte sunt foarte puternice mai ales dacă nu vom folosi anumite expresii specifice (folosind metacaracterele) cu ele. Analog, putem să căutăm un text ce precede un anumit şablon. Avem o pereche similară de operatori ce caută înainte. Vom folosi semnul < care caută înaintea potrivirii, potrivirea frisca doar dacă avem peste înaintea lui. Astfel pentru a căuta expresia de mai sus, vom folosi: /(?<=peste) frisca/ iar pentru a căuta toate torturile sau prăjiturile cu frisca : /(?<!peste) frisca/ 7

Hai să înlocuim cu peste si cartofi în loc de peste frisca si tort ciocolata în loc de tort frisca : Dacă vom modifica programul de mai sus după cum urmează: #!/usr/bin/perl #cautare3.plx use warnings; use strict; $_ = peste frisca si tort frisca ; print Comanda noastra initiala a fost, $_, \n ; s/(?<=peste) frisca/si cartofi/; print Acuma, am schimbat-o in, $_, \n ; s/(?<!peste) frisca/ciocolata/; print In final comanda este, $_, \n ; ne va returna: perl cautare3.pl Comanda noastra initiala a fost peste frisca si tort frisca Acuma, am schimbat-o in peste si cartofi si tort frisca In final comanda este peste si cartofi si tort ciocolata 2.5 Backreferences (din nou) Să ne uităm din nou la backreferences. Să presupunem că dorim să găsim orice cuvinte care se repetă. Cum putem face asta? Să încercăm să facem astfel: if (/\b(\w+) $1\b/) { print Cuvantul care se repeta: $1\n ; } Dar, vom vedea că aceasta nu funcńionează, deoarece $1 este obńinut doar după ce s-a terminat potrivirea. Vom vedea că, avem un mesaj de avertizare, care ne va spune că variabila $1 nu este definită. Pentru a face potriviri în timp ce suntem în timpul unei expresii regulate, vom folosi următoarea sintaxă: if (/\b(\w+) \1\b/) { print Cuvantul care se repeta: $1\n ; } 8

3 Concluzii Expresiile regulate ne oferă o modalitate foarte puternică atunci când căutăm şabloane întrun text, extrag bucăńi din text şi fac înlocuiri de text. Am văzut cum putem găsi potriviri simple, şi cum să ne referim mai apoi la bucăńi de potrivire, cum să înlocuim text şi chiar săl transformăm. Cheia învăńării şi înńelegerii expresiilor regulate este să fim capabili să împărńim în părńi componente pe care mai apoi să le procesăm. Odată ce începem să înńelegem scopul expresiilor regulate, vom fi în stare să creem potriviri complexe care să ne ajute. 4 Probleme de antrenament 4.1 Modificatori Inline Folosind nońiunile din acest laborator, realizańi un program care să conńină următoarele: Căutare case-insensitive doar pe anumite zone de text; Înlocuiri dacă şablonul respectate anumite condińii: urmează sau precede un anumit text; Coincide numărul de codificări cu numărul de decodificări? 9