Added empty pages and proper abstract + some more. More work remains.
[ailab3.git] / rapport.tex
blobd7c0cc1969f75520538940664f36f60885e40a9b
1 \documentclass[titlepage, a4paper, 12pt]{article}
2 \usepackage[swedish]{babel}
3 \usepackage[utf8]{inputenc}
4 \usepackage{verbatim}
5 \usepackage{fancyhdr}
6 \usepackage{graphicx}
7 \usepackage{parskip}
8 % Include pdf with multiple pages ex \includepdf[pages=-, nup=2x2]{filename.pdf}
9 \usepackage[final]{pdfpages}
10 % Place figures where they should be
11 \usepackage{float}
13 % vars
14 \def\title{Projekt}
15 \def\preTitle{Laboration 3: Information Retrieval \& Extraction}
16 \def\kurs{Artificiell Intelligens med inriktning mot kognition och
17 design B, ht 2008}
19 \def\namn{Anton Johansson}
20 \def\mail{dit06ajn@cs.umu.se}
21 \def\namnett{Victor Zamanian}
22 \def\mailett{dit06vzy@cs.umu.se}
24 \def\handledareEtt{Dennis Olsson, denniso@cs.umu.se}
25 \def\inst{datavetenskap}
26 \def\dokumentTyp{Laborationsrapport}
28 \begin{document}
29 \begin{titlepage}
30 \thispagestyle{empty}
31 \begin{small}
32 \begin{tabular}{@{}p{\textwidth}@{}}
33 UMEÅ UNIVERSITET \hfill \today \\
34 Institutionen för \inst \\
35 \dokumentTyp \\
36 \end{tabular}
37 \end{small}
38 \vspace{10mm}
39 \begin{center}
40 \LARGE{\preTitle} \\
41 \huge{\textbf{\kurs}} \\
42 \vspace{10mm}
43 \LARGE{\title} \\
44 \vspace{15mm}
45 \begin{large}
46 \namn, \mail \\
47 \namnett, \mailett
48 \end{large}
49 \vfill
50 \large{\textbf{Handledare}}\\
51 \mbox{\large{\handledareEtt}}
52 \end{center}
53 \end{titlepage}
55 \newpage
56 \thispagestyle{empty}
58 \newpage
60 \pagestyle{fancy}
61 \rhead{\footnotesize{\today}}
62 \lhead{\footnotesize{\namn, \mail \\ \namnett, \mailett}}
63 \chead{}
64 \lfoot{}
65 \cfoot{}
66 \rfoot{}
68 \begin{abstract}
69 Reguljära uttryck (Regular Expressions) är uttryck som innehåller
70 olika syntax för att identifiera, eller ''matcha'', specifika
71 textsträngar ur en större mängd text. Det finns många olika
72 användningsområden för reguljära uttryck inom området Artificiell
73 Intelligens, till exempel att hämta data från dokument på Internet och
74 tolka det utifrån någon preferens; ''Sök (och ersätt)''-funktioner i
75 ordbehandlare och textredigerare; och tolkning och validering av data,
76 till exempel datum-, telefon-, och personnummerinmatning i
77 webbformulär.
78 \end{abstract}
80 \newpage
81 \thispagestyle{empty}
83 \newpage
84 \tableofcontents
85 \newpage
86 \thispagestyle{empty}
88 \newpage
90 \rfoot{\thepage}
91 \pagenumbering{arabic}
93 % TODO @anton - Problem-solving as search, basic to AI, Norvig.
95 \section{Introduktion}
96 % till ämnet.
97 Denna rapport går igenom användandet av Reguljära uttryck (Regular
98 Expressions på engelska, även förkortat som ''regexp'' eller bara
99 ''regex'') med avseende på informationshämtning inom området
100 Artificiell Intelligens.
102 Rapporten är formulerad och utförd enligt specifikation på sidan:\\
103 \begin{footnotesize}
104 \verb!http://www.cs.umu.se/kurser/5DV063/HT08/assignments/lab3-spes-ht08.html!
105 \end{footnotesize}
107 \section{Syfte}
108 % med uppgiften, beskrivet med egna ord.
109 Syftet med rapporten är att fördjupa sig inom ett smalt ämne inom
110 området Artificiell Intelligens och presentera teori för det valda
111 ämnet på ett vetenskapligt sätt.
113 \section{Metodbeskrivning}
114 %: beskrivning av metod, material, design och procedur
115 Denna rapport är sammanställd främst genom en litteratur\-studie inom
116 om\-rådet Artificiell Intelligens i förhållande till Reguljära uttryck.
117 Information och tankar är samlade från böcker och internetsidor, för
118 att försöka få en överblick över de Reguljära uttryckens betydelse och
119 användande inom om\-rådet.
121 \section{Bakgrund}
122 %, teoretisk fördjupning
123 Enligt Jurafski \emph{et al.} \cite{speech} härstammar Reguljära
124 uttryck från Alan Turings modell (1936) för aritmetisk beräkning, även
125 kallad Turingmaskin. Denna maskin var abstrakt, ett tankeexperiment,
126 för att utföra beräkningar.
127 % TODO Church-Turings hypotes säger att varje tänkbar process kan
128 % utföras av en Turingmaskin, och alltså finns det rent principiellt
129 % inte någon mer kraftfull beräkningsmekanism. Enligt wikipedia
130 % http://sv.wikipedia.org/wiki/Turingmaskin
131 Inspirerad av Turings arbete skapade sedan Warren McCulloch och Walter
132 Pitts (1943) en förenklad modell för neuronen, se \cite{norvig}
133 kapitel 18. Stephen Cole Kleene definierade sedan (1951 och 1956) Ändlig
134 automation (Finite automation), Reguljära uttryck och påvisade deras
135 likhet. Både Reguljära uttryck och Finite automation är en del av den språktyp
136 som brukar kallas Reguljära språk, (Regular Language).
138 I \cite{speech} av Jurafski \emph{et al.} ger man ett exempel på hur
139 Finite automation och Reguljära uttryck förhåller sig till
140 varandra. Säg att man ska definiera ett naturligt språk, för enkelhets
141 skull försöker vi definiera vad som är ''ko-språk''. Vi kan säga att
142 korrekt ''ko-språk'' definieras av kombinationerna:
144 \begin{verbatim}
145 Muu!
146 Muuu!
147 Muuuu!
149 \end{verbatim}
151 Detta skulle kunna beskrivas med en modell för \textbf{Finite-state
152 automation} (ändlig automat) enligt Figur \ref{fig:finauto}.
154 \begin{figure}[H]
155 \begin{center}
156 \includegraphics[width=110mm]{images/state.pdf}
157 \caption{Ändlig automat för ''ko-språk''}
158 \label{fig:finauto}
159 \end{center}
160 \end{figure}
162 Tillstånden \verb!q0-q4! är de giltiga tillstånd som finns, \verb!q1!
163 är starttillståndet och \verb!q4! representerar sluttillstånd. Pilarna
164 i figuren markerar möjliga förflyttningar mellan tillstånden.
166 Denna information går även att representera som en
167 \textbf{State-transition-tabell}, som i Tabell \ref{tab:statetranstable}.
169 \begin{table}[h]
170 \centering
171 \begin{tabular}{|c|l|l|l|}
172 \hline
173 & \multicolumn{3}{|c|}{Indata} \\
174 \hline
175 Tillstånd & M & u & ! \\
176 \hline
177 0 & 1 & 0 & 0 \\
178 1 & 0 & 2 & 0 \\
179 2 & 0 & 3 & 0 \\
180 3 & 0 & 3 & 4 \\
181 4 & 0 & 0 & 0 \\
182 \hline
183 \end{tabular}
184 \caption{State-transition-tabell för ''ko-språk''.}
185 \label{tab:statetranstable}
186 \end{table}
188 State-transistion-tabeller läses uppifrån och ner. Starttillståndet 0
189 har en giltig förflyttning till tillstånd 1, detta gäller
190 enbart för indata M, för alla andra indata finns inga giltiga
191 förflyttningar, detta markeras med 0.
193 Det korresponderande \textbf{Reguljära uttrycket} för att beskriva
194 ''ko-språk'' skulle vara:
196 \begin{verbatim}
197 Muu+!
198 \end{verbatim}
200 Man läser det ungefär som man läser vanlig text. \verb!M! är tillåtet
201 starttillstånd, följt av ett \verb!u!, sedan markerar operatorn
202 \verb!u+! att en eller flera \verb!u! är tillåtna. Meningen avslutas
203 med \verb?!?, vilket markerar slutet på meningen i exemplet.
204 % Se sektion TODO för mer info om regexp syntax.
206 % REGEXP-MANUAL:
207 % Står på sidan 848 i Norvig.
209 Ett reguljärt uttryck består enkelt nog av text som ska matchas. Om
210 man vill matcha texten ''hej'' i en textsträng ''hoppsanhejsan'' så
211 blir det reguljära uttrycket helt enkelt bara ''hej'' och ''hej'':et i
212 ''hoppsanhejsan'' matchas. Däremot är det mer sällan man använder
213 reguljära uttryck för sådana enkla matchningar. Man vill i stället
214 använda dem till att matcha \textbf{generella mönster}. Ett exempel på
215 ett mönster skulle kunna vara en e-postadress på formen
216 \verb!<användarnamn>@<subdomän>.<domän>!, där \verb!<användarnamn>!
217 kan innehålla (i detta exempel) alla siffror, alla små och stora
218 bokstäver (från A till Z), understreck, punkt, procenttecken,
219 bindestreck och plus.
221 I stället för att behöva skriva ett textmönster för varje e-postadress
222 som är möjlig att konstruera (i praktiken oräkneligt antal
223 variationer) kan man använda sig av speciella ''texthändelser'' för
224 att beskriva till exempel början\slash slutet av ett ord och
225 början\slash slutet av en hel sträng. Man kan också definiera
226 teckenklasser som man vill inkludera i sitt uttryck, till exempel alla
227 stora bokstäver, alla små bokstäver, siffror, eller till och med
228 vilken godtycklig kombination av tecken som helst. Här nedanför visas
229 en kort tabell med några texthändelser och deras motsvarande reguljära
230 uttryck.
232 \begin{center}
233 \begin{footnotesize}
234 \begin{tabular}{|c|p{4cm}|l|l|l|}
235 \hline
236 \textbf{regex-uttryck} & \textbf{Texthändelse} & \textbf{Exempel} & \textbf{Matchar} \\ \hline
238 \verb!\b! & Början eller slutet på ett ord & \verb!\b!text\verb!\b! & ''ord1 \textbf{text} ord3'' \\ \hline
240 \verb!^! & Början av en textsträng & \verb!^!text & ''\textbf{text} i början'' \\ \hline
242 \verb!$! & Slutet av en textsträng & \verb!lutet$! & ''text i s\textbf{lutet}'' \\ \hline
244 \verb![A-Za-z0-9]! & Definierar klass med tecknen A till Z, a
245 till z och 0 till 9. & \verb![abc0-9]! & ''\textbf{b}r\textbf{a} text med \textbf{23} te\textbf{c}ken'' \\
247 \hline
249 \verb!.! (punkt) & Står för vilket tecken som helst. & \verb!^.! & ''\textbf{t}ext'' \\ \hline
250 \end{tabular}
251 \end{footnotesize}
252 \end{center}
254 Om man vill matcha en e-postadress i löpande text skulle man alltså
255 vilja använda sig av \verb!\b! runt uttrycket för att markera att det
256 som finns runt omkring adressen måste vara ordavgränsare av något
257 slag, dvs. någon typ av blanktecken. Vill man däremot kontrollera
258 indata från till exempel ett formulärfält där det är meningen att en
259 användare ska ange enbart en e-postadress är det däremot önskvärt att
260 omsluta uttrycket med \verb!^! i början och \verb!$! i slutet för att
261 markera att hela strängen måste \textbf{börja och sluta med} adressen.
263 Låt oss definiera en teckenklass med alla siffror, dvs
264 ''\verb![0-9]!'' och använda det i ett reguljärt uttryck, till exempel
265 ''\verb!\b$[0-9]!''. Om vi sedan försöker matcha strängen ''\$10000''
266 med det mönstret kommer vi endast matcha följande (fet stil)
267 ''\textbf{\$1}0000''. Detta beror på att teckenklassen vi definierat
268 matchar bara \textit{det första} tecknet som platsar i
269 klassen. Självklart skulle vi vilja kunna matcha flera tecken i en och
270 samma teckenklass utan att behöva definiera en likadan klass för hela
271 det antalet tecken vi vill matcha. Därför har man definierat något som
272 kallas kvantifierare som gör att man kan bestämma hur många gånger man
273 vill matcha en specifik klass, ett mönster eller bara ett tecken (så
274 kallade ''tokens''). Nedanstående tabell beskriver olika
275 kvantifierare.
277 \begin{center}
278 \begin{footnotesize}
279 \begin{tabular}{|c|p{4cm}|l|p{4cm}|}
280 \hline
281 \textbf{kvantifierare} & \textbf{Beskrivning} & \textbf{Exempel} & \textbf{Matchar} \\ \hline
283 \verb!?! & Matchar föregående uttryck noll eller en gång. &
284 colou\verb!?!r & ''\textbf{colour}'' och ''\textbf{color}'' \\ \hline
286 \verb!+! & Matchar föregående uttryck en eller fler gånger. &
287 Mu\verb:+:! & ''\textbf{Mu!}'', ''\textbf{Muu!}'',
288 ''\textbf{Muuu!}'', \ldots \\ \hline
290 \verb!*! & Matchar föregående uttryck noll eller flera gånger &
291 10\verb!*! & ''\textbf{1}'', ''\textbf{10}'', ''\textbf{100}'',
292 \ldots \\ \hline
294 \verb!{!$n$\verb!,!$m$\verb!}! & Matchar föregående uttryck
295 minst $n$ gånger och som mest $m$ gånger. &
296 \verb!^!1\verb![!0\verb!]{!1,5\verb!}! & ''\textbf{10}'',
297 ''\textbf{100}'', ''\textbf{1000}'', ''\textbf{10000}'' och
298 ''\textbf{100000}'' men inte ''1'' och inte ''1000000'' (6
299 nollor eller mer).\\ \hline
300 \end{tabular}
301 \end{footnotesize}
302 \end{center}
304 Nu kan vi beskriva många olika variationer av mönster genom olika
305 text\-händelser och kvantifierare, men vad händer om man vill inkludera
306 till exempel ett frågetecken i sitt mönster? Då måste man ''komma
307 runt'' (escape) frågetecknets regexp-betydelse för att komma åt dess
308 textuella värde. Detta görs vanligtvis med bakåtvänt snedstreck
309 (\textbackslash). Till exempel måste vi i vårt e-post\-adress\-mönster
310 matcha en punkt (i domännamnet), som vi måste uttrycka som
311 ''\verb!\.!''.
313 Nu har vi tillräckligt stor kunskap för att uttrycka ett reguljärt
314 uttryck som matchar en generell e-post\-adress. Vi börjar med att
315 beskriva \verb!<användarnamn>!. Användarnamnet kunde som sagt var
316 innehålla små och stora bokstäver (från A till Z), siffror, punkt,
317 understreck, procenttecken, plustecken och bindestreck. Vi uttrycker
318 detta som
320 \begin{verbatim}
321 \b[A-Za-z0-9._%+-]+
322 \end{verbatim}
324 där det sista plustecknet som sagt innebär att alla de tecken som den
325 definierade tecken\-klassen innefattar måste matchas minst en
326 gång. Plustecknet inom tecken\-klass\-definitionen tolkas som ett
327 ''textplus'' och inte som ett ''regex-plus''. Vi lägger också till
328 ordavgränsare som gör att uttrycket bara matchar användarnamnet i
329 början av ett nytt ord (dvs. själva e-post\-adressen) och inte matchar
330 ett användarnamn när det kommer direkt efter ett icke tillåtet
331 användarnamnstecken. Hade vi glömt ordavgränsaren hade följade
332 användarnamn matchats:
333 \\ ''\copyright\&\texttrademark\textexclamdown\textbf{sven.svensson}@host.doman''
334 vilket vi inte vill eftersom de icke tillåtna tecknen inte bör finnas
335 före användarnamnet.
337 Vi uttrycker sedan domännamnet som
339 \begin{verbatim}
340 [A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b
341 \end{verbatim}
343 där plustecknet betyder precis samma sak som i uttrycket för
344 användar\-namnet och ''\verb!\.!'' står för punktens textuella
345 värde. Sedan finns det ett krav på det som står efter punkten i
346 domännamnet, nämligen att denna ''token'' måste bestå av minst 2 och
347 som mest 4 tecken, därav kvantifieraren \verb!{!2\verb!,!4\verb!}!.
348 \verb!\b! i slutet av uttrycket innebär att det måste finnas en
349 ordavgränsare efter domännamnet.
351 Sätter vi nu samman dessa uttryck med ett snabel-a i mitten får vi ett
352 uttryck för en generell e-post\-adress \textbf{i löptext}. Vill vi
353 definiera ett uttryck för att undersöka om totala textmängden består
354 av endast en e-post\-adress kan vi ersätta \verb!\b! i början med
355 \verb!^! och i slutet med \verb!$! (till exempel om vi vill
356 kontrollera ett formulärfält på en webbsida)
357 \cite{regexinfo:website}. De två olika uttrycken ser ut som följer:
359 \begin{verbatim}
360 \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b
361 \end{verbatim}
365 \begin{verbatim}
366 ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$
367 \end{verbatim}
369 % Olika sätt att matcha e-mail adresser.
370 % \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b
371 % ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$
372 % http://www.regular-expressions.info/email.html
374 \section{Resultat}
375 % innehållande sammanställning/analys av eventuell testdata,
376 % implementering av algoritmer osv.
378 % TODO - resultat, användningsområden kopplade till AI.
379 % TODO @anton - Kolla upp och skriv om ELIZA, regexp memory.
380 \subsection{Applikationer av Reguljära uttryck}
381 Följande sektioner berör olika användningsområden för Reguljära
382 uttryck inom Artificiell intelligens.
384 \subsubsection{ELIZA}
385 Mer avancerade former av Reguljära uttryck kan använda sig av
386 minnesfunktioner för att spara tidigare matchningar. I
387 programmeringssråket Perl kan man göra ersättningar på formen:
388 \begin{verbatim}
389 s/hej/hejsan/
390 \end{verbatim}
392 Här ersätts alla \verb!hej! med \verb!hejsan!. För att spara träffar i
393 sökningen och ersätta med samma ord i ersättningssträngen använder man
394 grupper inom parenteser \verb!()!. Den sträng som en grupp matchar kan
395 sedan refereras till. \verb!\1!, till exempel, representerar
396 innehållet i första gruppen.
398 \begin{verbatim}
399 s/jag heter (\w+)/på dig \1, trevligt att höras/
400 \end{verbatim}
402 Ovanstående Reguljärt uttryck skulle ersätta ''Hej jag heter Anton''
403 med ''Hej på dig Anton, trevligt att höras''. Denna typ av Reguljära
404 ersättningar utgör grunden för implementationen av Chatroboten ELIZA,
405 som utvecklades av Joseph Weizenbaum, se \cite{speech}. Här följer en
406 kort konversation med Emacs implementering av ELIZA:
408 \begin{itemize}
409 \item[-] Hello my name is Anton
410 \item[-] \textbf{ELIZA:} How do you do? What brings you to see me?
411 \item[-] I need help with some Artificial Intelligence questions
412 \item[-] \textbf{ELIZA:} Why do you say you need help with some
413 artificial intelligence questions?
414 \item[-] I'm writing an essay about Regular Expressions
415 \item[-] \textbf{ELIZA:} Is it because of your plans that you say you
416 are writing an essay about regular expressions?
417 \item[-] yes
418 \item[-] \textbf{ELIZA:} I see... Well, what makes you believe this is so?
419 \end{itemize}
421 Ovanstående exempel vittar om att denna typ av chatrobot har en
422 relativt fast ram med frågor och svar att följa. Det tar inte lång tid
423 för en mänsklig användare att förstå att det inte är en mänsklig
424 motpart man kommunicerar med. ELIZA är implementerad för att svara på
425 frågor som rör psykoterapi--så fort man lämnar det bekanta ämnet blir
426 följdfrågorna ologiska ur ett mänskligt perspektiv.
428 Emacs implementation av ELIZA har en mängd hårdkodade svar. Följande
429 kodsnutt visar svaren som kan fås av indata som innehåller vissa
430 nyckelord gällade död:
432 \begin{footnotesize}
433 \begin{verbatim}
434 (setq deathlst
435 '((this is not a healthy way of thinking \.)
436 ((doc$ bother) you\, too\, may die someday \?)
437 (i am worried by your obsession with this topic!)
438 (did you watch a lot of crime and violence on television as a child \?))
440 \end{verbatim}
441 \end{footnotesize}
443 Även mängder med vanliga ord sparas för att på ett bättre sätt kunna
444 tolka indata, exempelvis vanliga synonymer, pronomen, verb och förkortningar:
446 \begin{footnotesize}
447 \begin{verbatim}
448 (setq replist
449 (wanna . (want to))
450 (gimme . (give me))
451 (gotta . (have to))
452 (gonna . (going to))
453 (never . (not ever))
454 ...)
455 \end{verbatim}
456 \end{footnotesize}
458 \subsubsection{Tolkning av indata}
459 Det finns en mängd användbara Reguljära uttryck för att tolka och på
460 ett vettigt sätt behandla indata som ett datorsystem får från
461 användare. Det kan gälla exempelvis verifiering av e-postadresser,
462 datum, person- och telefonnummer och så vidare. Detta är användbart
463 vid all typ av indata från användare, och i hög grad aktuellt när det
464 gäller forumlär på Internet.
466 Till exempel kan man istället för att kräva att användare ska skriva
467 för- och efternamn i separata rutor använda Reguljära uttryck för att
468 försöka tolka vad som är vad. Samma sak gäller adresser och
469 telefonnummer. Det kan vara intressant att ha information och ett
470 telefonnummers riktnummer och landskod, utan att för den sakens skull
471 kräva att en användare ska behöva specificera allt sådant manuellt.
472 Följer man bara vanliga konventioner för hur telefonnummer skrivs kan
473 man skapa ett Reguljärt uttryck för att fånga upp all denna
474 information ur en enda textsträng. All sådan här tolkning av indata är
475 väldigt bra ur användarsynpunkt, ''Don't make me click'', som Aza
476 Raskin säger i en presentation om användarvänlighet på webbsidor
477 \cite{raskin:website}.
479 %@TODO fixa url löpande
480 Ett annat bra exempel på hur Reguljära uttryck kan underlätta
481 inmatning av data finns implementerat i den webbaserade
482 kalendertjänsten från Google Inc.
483 (\begin{footnotesize}http://google.com/calendar/\end{footnotesize}).
484 För att skapa en ny händelse i kalendern kan användaren klicka på
485 aktuell dag och skriva till exempel ''Äta mat hos mamma kl
486 10-12''. Detta genererar en händelse med rubrik ''Äta mat hos mamma''
487 och placeras med start kl 10 och slut kl 12 i kalendern. Ett Reguljärt
488 uttryck för detta skulle kunna vara att matcha de första siffrorna
489 efter \verb!(kl|klockan)!, dessa borde vara starttimme för
490 händelsen. Följs dessa siffror av \verb!.! eller \verb!:! utan
491 mellanslag efter skulle nästa två siffror kunna representera minuter,
492 nästa siffror, eventuellt efter ett bindestreck, kan representera
493 sluttid. På detta sätt kan man med hjälp av Reguljära uttryck
494 representera naturligt språk för datorn. Vidare skulle extra nyckelord
495 kunna läggas in, till exempel \verb!hos!, \verb!på! eller \verb!i! för
496 att markera att det som följer är en plats, eller \verb!med! för att
497 markera att följande text innehåller information om deltagare i
498 händelsen.
500 \subsubsection{Datahämtning} \label{datah}
501 Reguljära uttryck kan användas för att hämta och tolka information ur
502 en större mängd data. Ett trivialt exempel är till exempel att försöka
503 svara på frågan, ''Vad är det för väder i Umeå idag?'' baserat på
504 innehållet från sidan:
506 \begin{verbatim}
507 http://www.tfe.umu.se/weather/1440/900/10/sv-SE/now.htm
508 \end{verbatim}
510 Html-taggen som visar den aktuella temperaturen i Umeå har följande
511 utseende:
512 \begin{verbatim}
513 <td class="tempfont" ... >0,7 &deg;C</td>
514 \end{verbatim}
516 Det som skiljer denna tagg från de andra på sidan är attributet\linebreak
517 \verb!class="tempfont"!. Den aktuella temperaturen visas mellan
518 \verb!<td ...>! och \verb!</td>!, det innebär att det i detta exempel
519 skulle vara $0,7\,^{\circ}\mathrm{C}$ dagen sidan hämtades. Följande
520 Reguljära uttryck matchar den strängen som innehåller temperatur i sin
521 första grupp, dvs uttrycket inom \verb!()!, som senare kan refereras
522 till med \verb!\1!:
524 \begin{verbatim}
525 <td class="tempfont.+?>([0-9]+,[0-9]+)
526 \end{verbatim}
528 Med denna information kan man sedan förenkla och säga att bra väder
529 gäller för alla $temperaturer \geq 15$ och dåligt väder gäller för
530 $temperaturer < 15$. Detta Reguljära uttryck är mycket specifikt och
531 enbart användbart på denna specifika sida så länge temperaturen
532 inkapslas exakt av den HTML-taggen och eventuella attribut.
534 \section{Diskussion}
535 % av resultatet, koppling till tidigare studier.
536 Reguljära uttryck har visat sig vara ett mycket användbart verktyg vid
537 hämtning och tolkning av data ur text, dock kan det bli väldigt
538 beräkningstungt om man använder sig av de mer komplicerade former av
539 Reguljära uttryck där man sparar undan grupper av träffar i
540 minnet. Den simplaste formen av Reguljära uttryck har en komplexitet
541 på $O(n)$ där $n$ är antalet tecken i texten där ett mönster söks.
542 Dessa typer av Reguljära uttryck kan implementeras med en
543 ''State-transition-tabell'', se sid \pageref{stt}. Vid användande av
544 mer avancerade Reguljära uttryck kan körningstiden öka exponentiellt i
545 förhållande till textmängden som ska sökas igenom.
547 För analys av data i XML-format som i sektionen om Datahämtning
548 \textbf{\ref{datah}} finns lämpade metoder såsom XQuery, Expat och
549 SAX.
551 \section{Slutsats}
552 Reguljära uttryck har visat sig vara mycket användbara inom vitt
553 spridda användningsområden. Användningsområdena som tagits upp i denna
554 rapport är enbart ett litet urval av de omfattande möjligheter som
555 Reguljära uttryck erbjuder. Vare sig man har använder sig av Reguljära
556 uttryck för att manipulera text direkt i en textredigerare eller om
557 man bygger in uttrycken i olika typer av applikationer och system så
558 erbjuder de Reguljära uttrycken nästintill oändliga möjligheter för
559 analys av text.
561 %. Använd minst två referenser utöver kursboken.
562 \bibliographystyle{alpha}
563 \bibliography{books}
565 \end{document}