Lektion inför Lab 1
Transcription
Lektion inför Lab 1
729G09 Språkvetenskaplig databehandling Lektion inför Laboration 1 vt15 Lars Ahrenberg Plan för lektionen Grupperingar Substitutioner Strängfunktioner i Python (kort repetition) Reguljära uttryck i Python sökfunktioner substitutioner Inför laboration 1 2 Övningar Skriv reguljära uttryck som matchar Ordet 'att' men inte 'katt' eller 'matta', Ett årtal mellan 1000 och 2999, Ett decimaltal som 2,15 eller 0,6871, En epostadress vid Linköpings universitet 3 Grupperingar () Parenteser används för att markera räckvidd: (ab)* möjliggöra referenser till något som redan matchat. Exempel: '(ab)c\1' matchar abcab varje par av parenteser sparas för sig '(ab)c(ba)' ger \1: ab, \2: ba I Pythonmodulen re används även group(1), group(2), ... 4 Reguljära substitutioner Ofta vill man modifiera det som man hittar med ett reguljärt uttryck, t.ex. ta bort det, eller stoppa in något i anslutning till det, t.ex. ett blanktecken, eller märka upp det, t.ex. med <tagg>...</tagg>, eller ändra något, t.ex. ä till ä 5 Substitutioner I UNIX-funktionen sed heter substitutionsoperatorn 's' och skrivs s/<regexp>/<newexp>/; I Python finns funktionen 'sub' i modulen re. 6 Reguljära substitutioner Gruppering är särskilt användbart vid substitutioner, t.ex. om vi vill göra skiljetecken till egna tokens i en text: s/([a-zåäö])([,:!\.\?])/\1 \2/; () anger grupperna grupperna numreras i den ordning de påträffas 7 Girighet Många operatorer är giriga, dvs. matchar så mycket som möjligt: 't*' matchar ett, '<.*>' matchar <tagg>en massa text här </tagg> Icke-girig matchning kan begäras: <.*?> matchar <tagg>en massa text här </tagg> 8 Strängfunktioner i Python find matchar en sträng mot en annan sträng s = 'Hello world!' s.find('world') 6 s.find('word') -1 s.find('world',7) -1 9 Strängfunktioner i Python replace byter ut en sträng mot en annan. s = 'Hello world!' s.replace('world','my friend') 'Hello my friend!' s.replace('o','u') 'Hellu wurld!' s.replace('o','u',1) 'Hellu world!' 10 find och replace tar bara argument som är konkreta strängar Substitutioner utan reguljära uttryck Strängfunktioner i Python kan användas för konkreta substitutioner, t.ex. replace(), capitalize(), lower(), upper(), … Exempel: string = 'abcabc' string.upper() returnerar 'ABCABC' 11 Reguljära uttryck i Python Modulen re compile() skapar reguljära mönster match() matchar endast i början search() hittar mönster (1 gång) findall()hittar mönster (alla förekomster) finditer() som findall fast flexiblare sub() substitutioner 12 Reguljära uttryck i Python 1. Importera modulen >> import re 2. Skapa text >> t = 'Bill och Bull' 3. Skapa ett sökmönster (regexp) >> regex = re.compile(r'[a-z]+') 4. Sök efter mönstret i texten, t.ex. >> regex.search(t) 13 Visa resultat av en sökning >> t = 'Bill och Bull' >> regex = re.compile(r'[a-z]+') >> matchobj = regex.search(t) search() returnerar första match som ett objekt >> print matchobj.group(0) ill returnerar den matchande strängen 14 Reguljära uttryck i Python raw-strängar (r' ') I Python kompileras reguljära uttryck. Både Pythons parser och parsern för modulen re ger särskild (men olika) betydelse åt symbolen '\'. För att det reguljära uttrycket säkert ska tolkas som sådant används raw-strängar, som man får genom att skriva r framför strängen (Pythonparsern blockeras). 15 Skapa ett reguljärt uttryck med compile() re.compile(r'regexp', Flaggor) r'...' ange regexp som en raw-sträng två flaggor re.U UNICODE: ger \w, \b m.fl. en tolkning enligt Unicode re.i IGNORECASE skiljer inte på stora och små bokstäver 16 Hitta alla matchande strängar >> t = 'Bill och Bull' >> regex = re.compile(r'[a-z]+') >> matchlist = regex.finditer(t) finditer() returnerar en lista med objekt >> for m in matchlist: print m.group(0) Vad returneras? 17 Gruppering av mönster - () >> t = 'bill och bull' >> rx = re.compile(r'([a-z]+) ([a-z]+)') >> matchlist = rx.finditer(t) >> for a b c m = = = in matchlist: m.group(0) # bill och m.group(1) # bill m.group(2) # och 18 Substitutioner >> t = 'bill och bull' >> rx = re.compile(r'[iu]') >> u = rx.sub(r'e', t) u är nu 'bell och bell' 19 Uppmärkning av text med sub >> t = 'Bill och Bull' >> rx = re.compile(r'([A-Z][a-z]+)') >> u = rx.sub(r'<NAMN>\1</NAMN>', t) u är nu <NAMN>Bill</NAMN> och <NAMN>Bill</NAMN> 20 Flera substitutioner i samma skript >> t = 'Bill, Bull och Bell.' >> rx1 = re.compile(r'[A-Z][a-z]+') >> rx2 = re.compile(r'([,\.])) >> t = rx1.sub(r'NAMN', t) >> t = rx2.sub(r' \1', t) t är nu 'NAMN , NAMN och NAMN .' 21 Lab 1: skriptskelett: lab1_script.py Fast del (ändra inte) import re import codecs with codecs.open("webbtext.txt", 'rb', encoding='utf8') as infile: webbtext = infile.read() infile.close() 22 Lab 1: skriptskelett: lab1_script.py Det finns två redigerbara delar. Den första utför sökningar: Ändra här! regex = re.compile(r'reguljärt uttryck', re.U) results = regex.finditer(webbtext) for result in results: print(result.group(0)) 23 Lab 1: skriptskelett: lab1_script.py Det finns två redigerbara delar. Den andra utför substitutioner: Ändrauttryck', här! regex = re.compile(r'reguljärt re.L) ny_text = regex.sub(r'ersättningsuttryck', webbtext) print(ny_text) och här! 24 Lab 1: anrop av script >> python3 lab1_script.py Ändra i skripten med valfri editor. Spara lösningarna för alla uppgifter på samma dokument, som blir redovisningen. Ge varje lösning lämplig rubrik på formen ”Uppgift N: … ” 25 Lab 1: krav G: 8 uppgifter med korrekt lösning. VG: 12 uppgifter (= alla) med korrekt lösning. 26 Teckenkodning Om man blandar teckenkodningar kan man få problem med svenska tecken: Allvarligt problem Estetiskt problem regexparna matchar inte å, ä, ö skrivs ut på annat sätt (t.ex. hexadecimalt) Teckenkodningar kan blandas utan att man tänker på det, t.ex. om man sparar en fil via sin webbläsare. 27