330 likes | 554 Views
Labb 1 - Textbearbetning med reguljära uttryck. Textbearbetning : Dela upp en text i meningar Hitta alla namn i en text Hitta adjektiv i superlativ Lektion reguljära uttryck re modulen i Python. Formella språk. Naturliga språk e ngelska, svenska, … Formella språk Programmeringsspråk
E N D
Labb 1 - Textbearbetning med reguljära uttryck • Textbearbetning: • Dela upp en text i meningar • Hitta alla namn i en text • Hitta adjektiv i superlativ • Lektion • reguljära uttryck • re modulen i Python
Formella språk • Naturliga språk • engelska, svenska, … • Formella språk • Programmeringsspråk • Användas för att modellera naturliga språk • Modellera uttryckstyper
Definitioner • Ett alfabet är en mängd av symboler • A = {0,1} • En sträng är en sekvens av symboler • 0011, 101, 1, 111 • Ett (formellt) språk är en mängd strängar som bildas med ett givet alfabet • L = {001, 01, 1, 111}
Chomskyhierarkin • Reguljära språk • Kontextfria språk • Kontextkänsliga språk • Obegränsade språk
Formella språk • Sheeptalk • Bä! • Bää! • Bäää! • Bääää! • … • Alfabet = {Bä!}
Formella språk • Ett (formellt) språk är en mängd strängar som bildas med ett givet alfabet • Definition av Sheeptalk • Uppräkning • {Bä!, Bää!, Bäää!, Bääää!, …} • Reguljära uttryck • Bää*! • * - noll eller flera av föregående symbol • Automater
Ändliga automater • Ändliga automater består av • En mängd tillstånd • Minst ett starttillstånd • Minst ett sluttillstånd • Tillståndsövergångar associerade med symboler (eller strängar) ur ett alfabet
Reguljära språk • Ett reguljärt språk kan definieras med hjälp av • ett reguljärt uttryck • en automat
Vad är en text? En textfil består av tecken t.ex.: Bill och Bull\nåt kanelbullar\t i parken. \n – radbrytning \t – tabtecken På skärmen (eller i en texteditor) visas texten så här: Bill och Bull åt kanelbullar i parken.
Reguljära uttryck Reguljärauttryckärettsättattdefinierasökmönster. • stödsav de flestaprogrammeringspråk • ävenSök/Ersätti Word Textfil: Bill coh Bull jagadePelle cohMaja. Sökmönster: ’och’ ’Bill’ ’B.ll’ . matchar ett tecken vilket som helst
Reguljära uttryck Reguljära uttryck - ett kraftfullare sätt att definiera en söksträng. ’Karlsson’ - Karlsson ’[KC]arlsson’ - Karlsson, Carlsson ’[KC]arl(s|ss|z|zs)on’ - Karlsson, Carlsson, Karlson, Carlson, Carlzon… [KC] – exakt ett tecken ur teckenmängden K och C (s|ss|z|sz) – en sträng, antingen ’s’, ’ss’, ’z’ eller ’sz’
Teckenmängder • [abcdef] – teckenmängdExakt ett tecken ur teckenmängden abcdef • [^abcdef] – komplementExakt ett tecken som inte tillhör mängden abcdef • [a-z] – intervall Exakt ett tecken från intervallet a-z • [a-zåäö] – Exakt ett tecken ur mängden tecken i svenska alfabetet Obs! ÅÄÖ kan inte ingå i intervallet och måste skrivas separat
Kvantifierare Anger antal av föregående deluttryck. Carina? Carina, Carin [0-9]+ Ex. 1, 12, 67, 34589, 544 … ba* Ex. b, ba, baa, baaa … (ba)* Ex. ’’, ba, baba, bababa …
Kvantifierare: Exempel • Ett ord, vilket som helst[a-zåäö]+ • Ett namn[A-ZÅÄÖ][a-zåäö]+ • Telefonnummer, 14 03 04 • [0-9][0-9] [0-9][0-9] [0-9][0-9] • [0-9]{2} [0-9]{2} [0-9]{2} • ([0-9]{2} ){3} ( ) – specialtecken, gruppering
Förankringstecken Definierar var i strängen mönstret ska finnas: ^ strängens början $ strängens slut \b ordgräns – mellan ord och icke-ord Ordtecken: A-ZÅÄÖa-zåäö0-9Icke-ordtecken: mellanslag , . ? : ; - ! etc Ex. ^B - ’Bra Björn!’ hej$ - ’Hej hej hej’ ’\ba’ – ’En glad anka’
Förankringstecken Förankringstecken matchar inget eget tecken. Ex.: \b - ordgräns ’Det står 2-3, sa mannen.’ |Det| |står| |2|-|3|, |sa| |mannen|.
Varför behövs en ordgräns? • Jämför
Referenser • En grupp av 2 likadana siffror t.ex. 22, 55, 77’([0-9])\1’ Tolkas: en siffra+ det som matchades i första parentesen ( ) - används både till gruppering och till att skapa en möjlig referent \1, \2, \3 - refererar till tidigare matchningar
Specialtecken • Specialtecken, t ex: . ? [ ] + * $ måste ”kvotas” med ”\” (backslash) för att tolkas som vanliga tecken. ? Specialtecken: 0 eller 1 av föregående uttryck\? Frågetecken. Specialtecken: Ett tecken, vilket som helst\. En punkt ( ) Specialtecken: Gruppering\(\) Startparentes och slutparentes
Girighet Vissaspecialteckent.ex. * och + ärgirigadvs. matcharalltidsåmycketsommöjligtav en rad. • Exempel:Skriv ett reguljärt uttryck som matchar html-taggarna i texten: <TAGG>En massa text här < /TAGG>
Girighet forts. Girigt: ’<.*>’ Matchar så lång sträng som möjligt. Matchar: <TAGG>En massa text här < /TAGG> Icke-girigt: ’<.*?>’ Matchar så kort sträng som möjligt Matchar: <TAGG> En massa text här < /TAGG>
Övningar Skriv ett reguljärt uttryck som matchar: • Ordet ’att’ men t.ex. inte ”katt”, ”skatt”, ”batteri” • Alla böjningsformer av substantivet ’hund’ • Alla årtal i en text • En svensk epostadress • Ord som består av små bokstäver och slutar på ’b’ • Ord som upprepas två gånger efter varandra t.ex. ”och och”, ”Lena Lena”
Reguljära uttryck i Python • Modulen re • compile() skapa regexp mönster • search() hitta ett mönster i en text • finditer() hitta alla förekomster av mönstret • sub() sök och ersätt 1 Importera re modulen >> import re >> text = ’Bill och Bull’ 2 Skapa ett sökmönster (reguljärt uttryck) >> regex = re.compile(r’[a-zåäö]+’, re.L) 3 Sök efter mönstret i en textsträng >> regex.search(text)
Skapa ett reguljärt uttryck med compile() re.compile(r’reguljärt uttryck’, flaggor) r’…’ ange det reguljära uttrycket som en raw-sträng Flaggor • re.L LOCALE tar hänsyn till lokala inställningar • re.I IGNORECASE skiljer inte på stora och små bokstäver Exempel regex = re.compile(r’[a-zåäö]+’, re.L)
Sök i en text >> text = ’Bill och Bull’ >> regex = re.compile(r’[a-zåäö]+’, re.L) Hitta första förekomsten av regex: matchobj = regex.search(text) returnerar ett matchobject matchobj.group() returnerar den matchade strängen
Gruppera mönster Gruppera uttryck med () >>> regex = re.compile(r'([a-z.]+)@([a-z.]+)', re.L) >>> m = regex.search('marho@ida.liu.se') >>> m.group(0) 'marho@ida.liu.se' >>> m.group(1) 'marho' >>> m.group(2) 'ida.liu.se’
Sök i en text forts. >> text = ’Bill och Bull’ >> regex = re.compile(r’[a-zåäö]+’, re.L) Hitta alla förekomster av regex i text: matchlist = regex.finditer(text) returnerar lista med matchobject for m in matchlist: printm.group() Hur många träffar i texten?
Sök och ersätt text • ”sök och ersätt” > regex.sub(r‘ersättningsssträng', textfil) • Ersätt alla matchningar av regex med ny text. • Ersättningstexten är en vanlig textsträng (inte ett reguljärt uttryck) >> regex = re.compile(r’coh’, re.L) >> ny_text = regex.sub(r‘och', textfil)Bill och Bull jagade Pelle och Maja.
Sök och ersätt text forts. Ersättningstexten kan innehålla referenser till sökuttrycket. Sök efter årtal och märk upp dem med taggar: \d – en siffra \d{4} – fyra siffror >> regex = re.compile(r’(\d{4})’, re.L) >> nytext = regex.sub(r‘<year>\1</year>', text) text : De reste till Spanien 1975. nytext: De reste till Spanien <year>1975</year>
Exempelskript 1 # script_find.py import re text_file = open("webbtext.txt", "r") webbtext = text_file.read() text_file.close() # HÄR SKRIVER NI ERA REGULJÄRA UTTRYCK! regex = re.compile(r'reguljärt uttryck', re.L) results = regex.finditer(webbtext) for result in results: print result.group(0)
Exempelskript 2 # script_sub.py import re text_file = open("webbtext.txt", "r") webbtext = text_file.read() text_file.close() # HÄR SKRIVER NI ERA REGULJÄRA UTTRYCK! regex = re.compile(r'reguljärt uttryck', re.L) ny_text = regex.sub(r'ersättningsuttryck', webbtext) print ny_text
Labb 1 Inlämningsuppgifter (13 st) • För G ska 9 uppgifter lösas korrekt • För VG ska alla 13 uppgifter lösas korrekt Lösningarna ska vara lingvistiskt korrekta. Testa sökmönster med redemo.py Läs före labben • Introduktion till reguljärauttryck • Kap 7. iProgrammeringi Python