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
© Copyright 2025