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. &auml; 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