Regulæruttrykk for søking i tekst

Like dokumenter
Linux-programmer som bruker regulæruttrykk: grep, sed, awk

Betinget eksekvering og logiske tester i shell

Mer om tekstbaserte verktøy og shellprogrammering i Linux

Håndtering av tekstfiler

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

Lynkurs i shellprogrammering under Linux

Filterprogrammer og redirigering av I/O

INF INF1820. Arne Skjærholt. Terza lezione INF1820. Arne Skjærholt. Terza lezione

Håndtering av tekstfiler

Introduksjon Oversikt over syntaks Eksempler og avslutning. Regex i Perl. Knut Auvor Grythe. September 21, 2006

Skanning del I INF /01/15 1

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord

Syntax/semantics - I INF 3110/ /29/2005 1

Scanning - I Kap. 2. Hva scanneren gjør

Hvordan velge lov eller forskrift

Filterprogrammer og redirigering av I/O

Shellprogrammer og -variabler

Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2)

Skanning del I. Kapittel 2 INF 3110/ INF

Litt om kompilering og interpretering. Dagens tema Syntaks (kapittel Komp. 47, kap. 1 og 2) Syntaks og semantikk

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger. - 3rd edition: Kapittel 8. Professor Alf Inge Wang

Dagens tema Grundig repetisjon og utdyping: Syntaks kontra semantikk

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

INF2820 Datalingvistikk V2018 Forelesning 3, 29. jan. Jan Tore Lønning

IN1140, H2018 gruppetime oppgaver Introduksjon til Tekst i Python

Hva er syntaks? En overskrift i en norsk avis: Dagens tema Grundig repetisjon og utdyping:

b) Hvis det er mulig å svare blankt (dvs. vet ikke) blir det 5 svaralternativer på hvert spørsmål, og dermed mulige måter å svare på.

TDT4110 IT Grunnkurs Høst 2016

INF120: Oblig 3. Yngve Mardal Moe

Dynamic Programming Longest Common Subsequence. Class 27

Et lite oppdrag i bakgrunnen

Øvingsforelesning 5 Python (TDT4110)

SAS FANS NYTT & NYTTIG FRA VERKTØYKASSA TIL SAS 4. MARS 2014, MIKKEL SØRHEIM

Øvingsforelesning 5 Python (TDT4110)

INF2100. Oppgaver 26. september til 1. oktober 2007

SAS-feil kavalkade. Viggo Skar Oslo Universitetssykehus HF (OUS)

Sekventkalkyle for utsagnslogikk

TDT4110 Informasjonsteknologi grunnkurs: Tema: Mer om strenger Utgave 3: Kap. 8

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

IN1140, H2018 gruppetime oppgaver Introduksjon til Tekst i Python

Stack. En enkel, lineær datastruktur

Python: Valg og betingelser. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Oversikt. Uke 2, INF 1000, 30 aug Variable, tilordninger og uttrykk. Repetisjon: Java programmering

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 11. august 1995 TID:

Norsk informatikkolympiade runde

TDT4110 IT Grunnkurs Høst 2015

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

if (be): else (not_to_be): TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap.

Kapittel 1 En oversikt over C-språket

7) Radix-sortering sekvensielt kode og effekten av cache

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

Beskrivelse av programmeringsspråket Simpila INF Kompilatorteknikk Våren 2012

TDT4165 PROGRAMMING LANGUAGES. Exercise 01 Introduksjon til Oz

EKSAMEN. Dato: 7. desember 2016 Eksamenstid: 09:00 13:00

Chapter 6 - Discrete Mathematics and Its Applications. Løsningsforslag på utvalgte oppgaver

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Norsk informatikkolympiade runde

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Repetisjon. 1 binærtall. INF3110 Programmeringsspråk. Sist så vi ulike notasjoner for syntaks: Jernbanediagrammer. BNF-grammatikker.

INF2100. Oppgaver 23. og 24. september 2010

LO118D Forelesning 4 (DM)

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

KursAdmin. Veileder Rapportverktøy. Musikkens Studieforbund

MATLABs brukergrensesnitt

INF3110 Programmeringsspråk

Fakultet for informasjonsteknologi, Institutt for datateknikk og informasjonsvitenskap

Programmeringsspråket C

Obligatorisk oppgave 1 INF1020 h2005

EKSAMEN (Konvertert fra en gammel PHP-eksamen)

GJØVIK INGENIØRHØGSKOLE

INF2820 Datalingvistikk V2017 Forelesning 3, 30.1 Jan Tore Lønning

1/31/2011 SAMMENHENGER FSA OG REGULÆRE UTTRYKK. Regulære språk. Fra FSA til RE. Fra regulært uttrykk til NFA REGULÆRE UTTRYKK I DATALINGVISTIKK DEL 2

Norsk informatikkolympiade runde

Videregående shellprogrammering

INF3110 Programmeringsspråk. Dagens tema. Typer (Kapittel 3 frem til ) Innføring i ML (Kapittel & ML-kompendiet.) 1/19

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

Programmeringsspråket C Del 2. Hans Petter Taugbøl Kragset

Del 1 En oversikt over C-programmering

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

TDT4110 IT Grunnkurs Høst 2016

INF2820 Datalingvistikk V2011. Jan Tore Lønning & Stephan Oepen

Matematikk for IT, høsten 2016

INF2810: Funksjonell Programmering. Strømmer

Representasjon av tall på datamaskin Kort innføring for MAT-INF1100L

Hjelpetekster for arkiv

INF2810: Funksjonell Programmering. Strømmer

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

TDT4110 Informasjonsteknologi grunnkurs: Tema: Lister og tupler. - 3rd edition: Kapittel 7. Professor Alf Inge Wang

INF2100. Oppgaver uke 40 og

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse

Norsk informatikkolympiade runde

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

TDT4105 Informasjonsteknologi grunnkurs: Uke 42 Strenger og strenghåndtering

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Turingmaskiner en kortfattet introduksjon. Christian F Heide

INF2810: Funksjonell Programmering. Mer om strømmer

Dagens tema. Perl: Mer om regulære uttrykk Filer Lister og tabeller Kompilering og interpretering (kapittel ) IN 211 Programmeringsspråk

INF2810: Funksjonell Programmering. Mer om strømmer

Haskell. Kjetil Ørbekk. Programvareverkstedet, 19. mars 2009

Transkript:

Regulæruttrykk

Regulæruttrykk for søking i tekst Aka. regex(p) / regular expressions Beskriver et søkemønster : Kan angi teksten vi søker etter eksplisitt : Jan Kan bruke metategn* til å angi variasjon: [Jj]an Flere varianter av regulæruttrykk, bl.a.: BRE: Basic Regular Expressions ERE: Extended Regular Expressions PCRE: Perl Compatible Regular Expressions *: Merk at noen av metategnene i regex er de samme tegnene som brukes i "file name generation" i Bash

Vanlige anvendelser av regulærutrykk Spam- / junkmail-filtre Google og andre søkemotorer Databaseverktøy Syntaks-sjekking i kompilatorer og interpretere Tolkere av naturlig språk Emacs og andre avanserte editorer Mange programmeringsspråk har innebygd regex-støtte Linux-verktøy som f.eks. grep, sed og awk

Eksempel: Spam-filtrering Vil finne e-poster som inneholder reklame for "Viagra" Spammere feilstaver bevisst slike ord som trigger spam-filtre Spammere utnytter også at den menneskelige hjernen er assosiativ når vi leser en e-post forstår vi både feilstavinger og ord som ligner

Eksempel: Spam-filtrering med regex Noen «kreative» omskrivinger: v.i.a.g.r.a v1agra vi ag ra vi@gr@ ViA6ra ViagR Regulæruttrykk kan brukes til å spesifisere alle slike kjente «feilstavinger» kompakt og presist En regex som dekker alle variantene ovenfor kan f.eks. se slik ut: [Vv][. ]?[ii1][. ]?[aa@][. ]?[gg6][. ]? [rr][. ]?[aa@]?

Match mellom regex og tekst Et regex prosesseres av en regex-maskin: Programvare som sammenligner det angitte tegnmønsteret med en gitt tekst Oftest en og en linje om gangen som sjekkes Vi får en match på en tekstlinje hvis linjen inneholder tegnmønsteret som regulæruttrykket beskriver

Noen metategn i regulæruttrykk * Null eller flere forekomster av forrige tegn + Én eller flere forekomster av forrige tegn? Null eller én forekomst av forrige tegn. Matcher alle tegn unntatt NEWLINE [] Ett av tegnene angitt mellom [ og ] [^] Ett av tegnene ikke angitt mellom [^ og ] \ Ikke behandle neste tegn som metategn

Kontroll av repetisjon: * +? Angir antall ganger tegnet foran metategn kan forekomme: * Null eller flere forekomster + Én eller flere forekomster? Null eller én forekomst Merk: En regex med * eller + vil matche et uendelig antall strenger

Eksempler: * +? 0*1 Matcher null eller flere 0 etterfulgt av 1: 000001 0001 01 1 0+1 Én eller flere 0 etterfulgt av 1: 000001 0?1 0001 01 (men ikke bare 1) Null eller én 0 etterfulgt av 1 01 1 (ingen andre matcher)

. (punktum): Wildcard/jokernotasjon Metategnet. matcher et hvilket som helst enkelt tegn, med unntak av tegnet NEWLINE Eksempel: b.t Matcher en b, etterfulgt av ett vilkårlig tegn, etterfulgt av en t Matcher f.eks.: bat, bet, bit, bot, but, byt, b2t, b t (b, space, t) og bbt Matcher ikke f.eks. bt og beat

* + & kan endre betydningen av. b.*t Matcher en b fulgt av 0 eller flere forekomster av hva som helst, etterfulgt av en t: bat, bet, bit, bot, bt, beat, bbbbbt, b23176127836t, b!# %&/t b.+t Matcher det samme som b.*t, med unntak av at det ikke matcher bt b.?t Som b.t, men vil også matche bt

Hvor i en tekstlinje matcher en regex? Regex: b?.t+ 0 eller 1 b, ett vilkårlig tegn og minst én t Linje: Er det match mellom regex og linje? Svaret er ja, fordi: bbbbbbbattttttt 7 b, deretter 1 a og 7 t Linjen/strengen inneholder en substreng som matcher Prøver alltid å matche alle substrenger på en tekstlinje

Metategn for å kontrollere hvor i teksten en regexp matcher ^ Begynnelse på en linje $ Slutten på en linje \< Begynnelse på et ord \> Slutten på et ord

Eksempler regex matcher ^Jan Jan er en hyggelig fyr Jan$ Linuxnerden heter Jan \<know I have knowledge about this known\> This is unknown to me

Matche hele linjer og hele ord regex matcher ^Jan er grei$ Jan er grei ^$ tom linje (bare NEWLINE) \<unknown\> This is unknown to me Hva matcher denne?: ^ab*c+$

[] : Angi eksakt hvilke tegn som kan matche. (punktum) matcher ett vilkårlig tegn (hva som helst) [list] matcher også bare ett tegn, men kun ett av tegnene som er angitt eksplisitt i listen Eksempel: J[abc]n matcher Jan Jbn Jcn

Angivelse av tegnlister inne i [] Kan angis på tre ulike måter: [list] F.eks. [abcde] eller [0123456789] [range] F.eks. [a e] eller [0 9] [[:class:]] Bruker en tegnklasse, som definert i POSIX-standarden for klassifisering av tegn, f.eks. [[:alpha:]] (bokstaver)

POSIX-tegnklasser som kan brukes i regex Class :alnum: :alpha: :blank: :cntrl: :digit: :graph: :lower: :print: :punct: :space: :upper: :xdigit: Meaning Any letter or digit Any letter Space and tab Any control character Any digit Any non-whitespace Lower case letter Any printable character Any punctuation mark including [ and ] Any whitespace (space, tab, new line, form feed, carriage return) Any upper case letter Any digit or hexadecimal digit

Eksempler: Regex med tegnlister H[ABC][0 9] HA0 HB1 HC7 HA4... H[a zæøå]iberg Høiberg Haiberg Hxiberg Hæiberg... H[a z]* H Haaaa Habcdefg Hzzzzaaa... [0 9]+ Matcher alle sekvenser med bare siffer ^[0 9]+$ Matcher alle hele linjer med bare siffer ^[[:digit:]]*$ Som forrige, matcher også tom streng [abc][abc][abc] aaa abc cba cbc bbc cab ccc...

Eksempel: Fornavn Etternavn ^[[:upper:]][[:lower:]]+ [[:upper:]][[:lower:]]+$ Matcher hele linjer med bare to ord Ordene må være skilt med én enkel SPACE Stor bokstav først i hvert ord, resten små bokstaver: Robbie Robertson Levon Helm Cashmere Cat

En annen bruk av metategnet ^ Tegnet ^ ( caret / hat ) kan brukes inne i [] for å angi tegn som ikke skal forekomme Eksempel: J[^abc]n Jdn J3n Jzn JAn J n J@n... Bruken av ^ for å utelukke tegn er ofte litt tricky * *: Kommandoen grep tilbyr en enklere mekaniske for ikke å matche tegn/strenger

Eksempler: ^ utenfor og inne i [] ^[^0 9] Match any string that does not start with a digit ^[^0 9]+$ Match any string that contains no digits ^[^0 9].*[^0 9]$ Match any string that does not start or end with a digit but may have digits in between ^[^0 9].*[0 9].*[^0 9]$ Match any string that contains at least one digit but not at the beginning or end

Matching av metategn Hvordan matche f.eks. et punktum? b.t vil matche b.t men også bat b2t bxt... For å matche et punktum eksakt, er det to muligheter: \. "Backslash escape": Neste tegn behandles ikke som metategn [.] De fleste metategn "virker ikke" inne i [] * Eksempel: Hva matcher J\\\*n? * Noen tegn må "escapes" med backslash også inne i [], f.eks. [\[\]] matcher enten [ eller ]

Eksempel med metategn: Ligninger Enkel ligning: 2 + 2 = 4 Generell form:, 3 * 3 = 9 Tall operator tall = tall Antar at det er en enkel SPACE mellom tall og tegn i ligningen Operatorene som kan brukes er: * / + % (mod) Merk at: * + er metategn i regulæruttrykk (minustegn) er metategn også inne i [] (angir range) To løsninger som begge virker: [0 9]+ [*/+\ %] [0 9]+ = [0 9]+ [0 9]+ [*/+% ] [0 9]+ = [0 9]+

Kontroll på antall repeterte tegn Metategnene * og + angir et vilkårlig antall gjentagelser av foregående tegn Metategn for å kontrollere antall gjentagelser: {n} Nøyaktig n forekomster av forrige tegn {n,m} Minst n og høyst m forekomster av forrige {n,} n eller flere forekomster av forrige tegn n og m må være ikke-negative heltall og n m

Eksempler: Antall repetisjoner ab{2} Matcher abb ab{3,} Matcher abbb abbbb abbbbbb... Norske registreringsnumre for biler: [A Z]{2}[1 9][0 9]{4} Norsk 11-sifret bankkontonummer: [0 9]{4}\.[0 9]{2}\.[0 9]{5}

Angivelse av tegnsekvenser som metategn skal virke på Metategnene for repetisjon virker på enkle tegn Vi kan få dem til å virke på tegnsekvenser, f.eks. hele ord, ved å bruke metategnene () venstre og høyre parantes til å gruppere tegn sammen () kan også brukes til å neste flere regulæruttrykk inne i hverandre

Eksempler: Bruk av () (Jan){2,3} matcher JanJan og JanJanJan Linjer med minst 6 "ord", skilt fra hverandre med SPACE: ^([A Za z][a z]* ){5,}[A Za z][a z]*$ Amerikanske telefonnummer (123) 456-7890 : (\([0 9]{3}\) )?[0 9]{3} [0 9]{4} Noen nestede regulæruttrykk (repetisjon inne i repetisjon): (A+ ){4,} ((ABC){2})+ ((AB){2}C){2}

Valg mellom flere regulærutrykk Regulæruttrykk tilbyr en enkel mekanisme for å kunne matche en streng med flere ulike regulæruttrykk samtidig Angis med metategnet (vertikal strek, "or") Kan kombineres med () for å sikre riktig rekkefølge i evaluering av regularuttrykkene Kan også bruke () til å neste flere "or" inne i hverandre

Eksempler på bruk av Matche AB eller CD eller EF : Virker ikke (hvorfor?): [ACE][BDF] Virker: AB CD EF Matche begge stavemåtene av "grå" på engelsk: gr(a e)y Amerikanske postnumre (ZIP-codes): Enten 5 siffer (12345) eller 9 siffer (12345-6789) ([0 9]{5}) ([0 9]{5} [0 9]{4})

Eksempel: Bilskilter i Norge Norske sivile registreringsnumre for bil etter 1950: AA12345 A-1 A-12 A-1234 A-12345 A-123456 12-34-56 Regulæruttrykk som matcher alle skilt-typene: [A Z]{2}[1 9][0 9]{4} [A Z] [1 9][0 9]{0,5} ([0 9]{2} ){2}[0 9]{2}