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 Chomskyhierarkin 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} Reguljära språk Kontextfria språk Kontextkänsliga språk Obegränsade språk Formella språk Formella språk Sheeptalk Bä! Bää! Bäää! Bääää! Alfabet = {Bä!} 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 1
Ändliga automater Reguljära språk Ä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 Ett reguljärt språk kan definieras med hjälp av ett reguljärt uttryck en automat Vad är en text? Reguljära uttryck 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 är ett sätt att definiera sökmönster. stöds av de flesta programmeringspråk även Sök/Ersätt i Word Textfil: Bill coh Bull jagade Pelle coh Maja. Sökmönster: och Bill B.ll. matchar ett tecken vilket som helst Reguljära uttryck Teckenmängder 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 [abcdef] teckenmängd Exakt ett tecken ur teckenmängden abcdef [^abcdef] komplement Exakt 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 2
Kvantifierare Anger antal av föregående deluttryck.? 0 eller 1 * 0 eller flera + 1 eller flera Carina? Carina, Carin [0-9]+ Ex. 1, 12, 67, 34589, 544 ba* Ex. b, ba, baa, baaa (ba)* Ex., ba, baba, bababa Kvantifierare forts.? 0 eller 1 * 0 eller flera + 1 eller flera {2} 2 {2,5} 2 till 5 {2,} Minst 2 ggr {,3} Högst 3 ggr Kvantifierare: Exempel Förankringstecken 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 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-9 Icke-ordtecken: mellanslag,.? : ; -! etc Ex. ^B - Bra Björn! hej$ - Hej hej hej \ba En glad anka Förankringstecken Varför behövs en ordgräns? Förankringstecken matchar inget eget tecken. Jämför Ex.: \b - ordgräns Det står 2-3, sa mannen. Det står 2-3, sa mannen. ^De ^De\b Karlsson \bkarlsson\b De första åren... Det är Denne De betraktade mig De första åren blev svåra. Han ringde till Eva Karlsson. Använd Karlssons klister. Han ringde till Eva Karlsson. Larson och Karlsson var där. 3
Referenser Specialtecken 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, 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 Girighet forts. Vissa specialtecken t.ex. * och + är giriga dvs. matchar alltid så mycket som möjligt av en rad. Exempel: Skriv ett reguljärt uttryck som matchar html-taggarna i texten: <TAGG>En massa text här < /TAGG> 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 Reguljära uttryck i Python Skriv ett reguljärt uttryck som matchar: 1) Ordet att men t.ex. inte katt, skatt, batteri 2) Alla böjningsformer av substantivet hund 3) Alla årtal i en text 4) En svensk epostadress 5) Ord som består av små bokstäver och slutar på b 6) Ord som upprepas två gånger efter varandra t.ex. och och, Lena Lena 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) 4
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 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) t) returnerar ett matchobject matchobj.group() returnerar den matchade strängen Exempel regex = re.compile(r [a-zåäö]+, re.l) Gruppera mönster Sök i en text forts. 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 >> text = Bill och Bull >> regex = re.compile(r [a-zåäö]+, re.l) Hitta alla förekomster av regex i text: matchlist = regex.finditer(text) for m in matchlist: print m.group() Hur många träffar i texten? returnerar lista med matchobject Sök och ersätt text Sök och ersätt text forts. 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. 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> 5
Exempelskript 1 Exempelskript 2 # 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) # 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 lingvistiskti korrekta. kt Testa sökmönster med redemo.py Läs före labben Introduktion till reguljära uttryck Kap 7. i Programmering i Python 6