Ohjelmoinnin peruskurssien laaja oppimäärä

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 5. Timo Savola. 28. huhtikuuta 2006

Ohjelmoinnin peruskurssien laaja oppimäärä

Luento 4. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Ohjelmoinnin peruskurssien laaja oppimäärä

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmoinnin perusteet Y Python

Korpusten käsittely clt131, P Luento 5

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin perusteet Y Python

Tutoriaaliläsnäoloista

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ohjelmoinnin perusteet Y Python

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

Korpusten käsittely clt131, P Luento 4

815338A Ohjelmointikielten periaatteet

Ohjelmoinnin perusteet Y Python

Zeon PDF Driver Trial

Tehtävä 2: Säännölliset lausekkeet

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Java kahdessa tunnissa. Jyry Suvilehto

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Ohjelmoinnin perusteet, syksy 2006

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Tietorakenteet ja algoritmit - syksy

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Tämän lisäksi listataan ranskalaisin viivoin järjestelmän tarjoama toiminnallisuus:

15. Ohjelmoinnin tekniikkaa 15.1

17. Javan omat luokat 17.1

17/20: Keittokirja IV

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Groovy. Niko Jäntti Jesper Haapalinna Group 31

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Harjoitustyön testaus. Juha Taina

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin perusteet Y Python

Muusta kuin vesisioista

Muistutus aikatauluista

Harjoitustyö: virtuaalikone

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Taulukot. Jukka Harju, Jukka Juslin

Korpusten käsittely clt131, P Luento 3

1. Omat operaatiot 1.1

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

17. Javan omat luokat 17.1

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Algoritmit 2. Luento 2 Ke Timo Männikkö

Ohjelmoinnin peruskurssi Y1

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Ohjelmoinnin perusteet Y Python

5. HelloWorld-ohjelma 5.1

Yksikkötestaus. import org.junit.test; public class LaskinTest public void testlaskimenluonti() { Laskin laskin = new Laskin(); } }

Ohjelmoinnin peruskurssien laaja oppimäärä

Tietorakenteet, laskuharjoitus 7,

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Ohjelmoinnin perusteet Y Python

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin peruskurssien laaja oppimäärä

Transkriptio:

Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Lisää suunnittelumalleja, laadusta, säännölliset lausekkeet Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 11. 3. 2013

Sisältö 1 Suunnittelumalli Observer 2 Suunnittelumalli Adapter 3 Suunnittelumalleja: Composite ja Double-dispatch 4 Suunnittelumalleja: Command, Strategy ja Template Method 5 Sekalaista ohjelmien laadusta 6 Säännölliset lausekkeet

(ei-laajan kurssin kalvo: luento 10 sivu 30) Observer Observer Observer mahdollistaa toiminnan, jossa muutos yhdessä oliossa aiheuttaa automaattisesti muutoksen kaikissa siitä riippuvissa olioissa Riippuvat oliot vain pyytävät kiinnostavaa oliota kertomaan muutoksista Käytännössä kiinnostavalla oliolla on lista johon kiinnostuneet (Listener, Observer) voivat ilmoittautua Kun jotain tapahtuu, käydään jokainen listallaolija läpi ja kutsutaan jokaisen kohdalla ilmoitusmetodia. Yleensä ilmoitusmetodille vielä annetaan pikku viesti (Event) joka kuvaa tapahtuneen asian Kuunneltavan ei tarvitse tietää kuuntelijasta muuta kuin että se täyttää kuuntelija -rajapinnan 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 31) Observer UML-kaavio <<interface>> Havainnoitava +lisaakuuntelija( ) +poistakuuntelija( ) +ilmoitamuutos( ) havainnoijat[] Suorittaa kaikille havainnoijille metodin ilmoitamuutos() <<interface>> Havainnoija +ilmoitamuutos() SeurattavaLuokka HavainnoijaToteutus Toteutus voi halutessaan reagoida muutokseen 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 32) Observer Observer-malli Yksi parhaista esimerkeistä Observer-mallin käytöstä on käyttöliittymien käyttämät tapahtumankuuntelijat Käytännössä mallia voidaan käyttää mihin tahansa tilanteeseen, jossa useamman paikan ohjelmassa tulee reagoida johonkin muutokseen. Tulostus päättyy Puuhun lisätään solmu Äänikanava suljetaan jne.. 12:22

Sisältö 1 Suunnittelumalli Observer 2 Suunnittelumalli Adapter 3 Suunnittelumalleja: Composite ja Double-dispatch 4 Suunnittelumalleja: Command, Strategy ja Template Method 5 Sekalaista ohjelmien laadusta 6 Säännölliset lausekkeet

(ei-laajan kurssin kalvo: luento 10 sivu 14) Adapter Ongelma : Jokin osa olemassaolevaa koodia toimii tietyn rajapinnan täyttävien olioiden kanssa. Tarjolla olevien olioiden luokka ei kuitenkaan täytä tätä rajapintaa. Alkuperäistä luokkaa ei kuitenkaan haluta muuttaa. Ratkaisu : Adapter sovittaa jonkin olemassaolevan luokan rajapinnan muotoon, jota jokin toinen osa ohjelmasta odottaa. Tästä suunnittelumallista on kaksi versiota : olioadapteri luokka-adapteri 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 15) Adapter - olioadapteri Toteutus : Käyttävä luokka tekee kaiken toimintansa adapteri-olioiden kanssa, jotka täyttävät vaaditun rajapinnan. Adapterioliosta on viittaus varsinaiseen olioon Rajapinnan mukaiset metodikutsut delegoidaan viittauksen kautta eteenpäin oikealle oliolle Käyttävä Luokka Tuttu Rajapinta Adapteri Käytettävä Luokka 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 16) Adapter - luokka-adapteri Adapteri voi myös periä luokan (jos mahdollista), jonka rajapintaa se muuttaa. Tällöin adapteri täyttää rajapinnan vaatimat metodit, joiden tehtävä on kutsua yliluokan metodeja. Käyttävä Luokka Tuttu Rajapinta Adapteri Käytettävä Luokka 12:22

Sisältö 1 Suunnittelumalli Observer 2 Suunnittelumalli Adapter 3 Suunnittelumalleja: Composite ja Double-dispatch 4 Suunnittelumalleja: Command, Strategy ja Template Method 5 Sekalaista ohjelmien laadusta 6 Säännölliset lausekkeet

(ei-laajan kurssin kalvo: luento 10 sivu 19) Composite Joissakin tietorakenteissa (esim. puu) rakenteen osaset koostuvat pienemmistä osasista (lapset), jotka taas koostuvat pienemmistä osasista jne. Composite-mallissa koko rakenteelle voi suorittaa operaation tekemällä sen vain yhdelle osaselle Toteutuksessa suurempaa rakennetta ja sen osasia käsitellään samalla tavalla. Kaikki osaset täyttävät saman rajapinnan. Isomman rakenteen operaatio tehdään myös sen lapsille 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 20) Composite Esimerkki Tekstinkäsittelyohjelma, jossa kappaleet koostuvat alikappaleista ja tekstistä, jotka molemmat täyttävät rajapinnan TekstiRakenne TekstiRakenne-luokassa on metodi oikolue() Kappale-luokan oikolue kutsuu metodia oikolue() sisältämilleen Kappale-olioille ja sisältämälleen Teksti-oliolle Teksti-olio suorittaa oikoluvun normaalisti. Etuja: Koko tekstin tai osan siitä voi oikolukea kutsumalla metodia oikolue vain kerran. Muun osan koodia ei tarvitse toimia eri tavalla riippuen siitä, millaista tekstirakennetta käsitellään, koska toiminta on ulospäin samanlaista. 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 21) Composite UML-kaavio Huomaa että toteutuksessa erilaisia Komponentti-rajapinnan täyttäviä rakenteita voi olla paljon erilaisia, tai jopa vain yksi Käyttävä Luokka <<interface>> Komponentti +operaatio( ) lapset Alkio +operaatio() Komposiitti +operaatio() Suorittaa kaikille lapsille metodin operaatio() 12:22

Double-dispatch ongelma: halutaan valita kutsuttava metodi useamman kuin yhden olion luokan perusteella esimerkki: piirto-ohjelmassa on kolme muotoa (Triangle, Rectangle, Circle) ja kaksi tulostuslaitetta (Window, Printer) oletetaan että kaikki 3 2 = 6 metodia ovat erilaisia jos koodissa on muotoa kuvaava olio m sekä tulostuslaitetta kuvaava olio t, miten metodikutsu tehdään? ei-olioratkaisu: isinstance:a käyttävä ifelse-ketju, joka valitsee oikean metodin m:n ja t:n luokan perusteella ratkaisu double-dispatch-suunnittelumallilla: jompaan kumpaan luokkahierarkiaan välimetodi, joka ottaa toisen argumentiksi esim. Window- ja Printer-luokkiin metodi display(a: Shape), joka kutsuu joko a.displayonwindow-metodia tai a.displayonprinter:iä mm. Common Lispissä on myös suora tuki monen olion avulla tehtävään metodinvalintaan (tavallisissa oliokielissähän metodi otetaan self-argumentin luokasta)

Sisältö 1 Suunnittelumalli Observer 2 Suunnittelumalli Adapter 3 Suunnittelumalleja: Composite ja Double-dispatch 4 Suunnittelumalleja: Command, Strategy ja Template Method 5 Sekalaista ohjelmien laadusta 6 Säännölliset lausekkeet

(ei-laajan kurssin kalvo: luento 10 sivu 26) Command Joskus halutaan suorittaa jokin toiminto tietämättä ennalta mitään kutsuttavasta metodista tai oliosta jonka metodia kutsutaan. Command-mallin idea on kapsuloida metodikutsu olion sisään. Komento-olioita vaihtamalla voidaan vaihdella toiminnallisuutta Oliot voivat Command-olioiden kautta kutsua metodeja, jotka voidaan toteuttaa niistä täysin irrallisina. Komentoa Käyttävä Luokka Kohde +operaatio() komennonkohde <<interface>> Komento +suorita() TodellinenKomento +suorita() komennonkohde.operaatio() 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 27) Command Command-olioita voidaan puskuroida, tallentaa jne. Voidaan tehdä makroja, tai suorittaa vasta kun mahdollista Komennoista voidaan joissain tilanteissa tehdä peruutettavia. Suorita()-metodi tallentaa tällöin olennaiset tiedot jotta peruutuksen voi tehdä. Lisätään rajapintaan metodi peruuta() Laitetaan Komento-oliot talteen niiden suorituksen jälkeen PoistuKomento Ohjelma Komentoa Käyttävä Luokka <<interface>> Komento +suorita() +suorita() KopiointiKomento +suorita() +lopeta() Leikepöytä +kopioivalinta() 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 22) Strategy Oletetaan että on olemassa joukko erilaisia tapoja ratkaista jokin laskennallinen ongelma Strategy-mallissa kirjoitetaan ensin ratkaisulle yleinen toteutus jossa vaihtoehtoiset kohdat on ulkoistettu muiden luokkien tehtäväksi Vaihtoehtoisille kohdille on kirjoitetaan rajapinta jonka kautta yleinen toteutus käyttää ulkoistettuja osia. voidaan toteuttaa erilaisia ratkaisutapoja jotka toteuttavat k.o. rajapinnan kautta jonkin osan ratkaisua, mutta ei tarvitse kirjoittaa koko koodia Nyt ratkaisutapaa voidaan haluttaessa helposti muuttaa esim. tekstin jakaminen riveihin vaihtelee kielen mukaan esim. alkioiden vertailu keskenään järjestettäessä 12:22

(ei-laajan kurssin kalvo: luento 10 sivu 24) Template Method Template method toimii muuten kuin Strategy, mutta puuttuvat osat algoritmia on kirjoitettu abstrakteiksi metodeiksi Metodit toteutetaan aliluokassa jonka jälkeen algoritmi on käyttökelpoinen 12:22

Esimerkki: SICP:n sqrt-iter sqrtpat.py class IterativeImprove(object): # Strategy-versio def init (self, istrategy): self.istrategy = istrategy def run(self, x): guess = 1.0 while not self.istrategy.good_enough(guess, x): guess = self.istrategy.improve(guess, x) return guess class SqrtStrategy(object): def good_enough(self, guess, x): return abs(guess*guess - x) < 0.001 def improve(self, guess, x): return average(guess, x/guess) class IterativeImproveTemplate(object): # Template Method -versio def run(self, x): guess = 1.0 while not self.good_enough(guess, x): guess = self.improve(guess, x) return guess class Sqrt(IterativeImproveTemplate): def good_enough(self, guess, x): return abs(guess*guess - x) < 0.001 def improve(self, guess, x): return average(guess, x/guess)

Nämä mallit funktioargumenteilla nämä suunnittelumallit muistuttavat funktioargumenttien käyttöä tehty kieliin, joissa ei ole ensimmäisen luokan funktioita Command on käytännössä vain funktio paitsi peruutuksen kanssa se kytkee yhteen kaksi funktiota Strategy ja Template Method: kuin nimettyjä funktioita samankaltainen olisi funktio, joka ottaa muita funktioita argumentiksi (vrt. sqrt-iter SICP:ssä) idean voi toki yleistää esim. moduuleihin: useita vaihtoehtoisia moduuleita, joissa on sama rajapinta monia muitakin suunnittelumalleja voi ainakin periaatteessa yksinkertaistaa dynaamisten kielten ominaisuuksilla funktioiden lisäksi mm. sillä että luokat ovat olioita (esim: luokkaolio joskus tehdasolio) lisää tästä ks. http://www.norvig.com/design-patterns/

Sisältö 1 Suunnittelumalli Observer 2 Suunnittelumalli Adapter 3 Suunnittelumalleja: Composite ja Double-dispatch 4 Suunnittelumalleja: Command, Strategy ja Template Method 5 Sekalaista ohjelmien laadusta 6 Säännölliset lausekkeet

(ei-laajan kurssin kalvo: luento 11 sivu 2) Laatukriteerit Code quality is the measure of individual components for compliance with standards and best practices in the context of a specific language --- Consortium for IT Software Quality, CISQ Suorituskyky Koodin vakaus Turvallisuus Ylläpidettävyys 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 12) Ylläpidettävyys Suunnittele odottamattoman varalle Vähemmän koodia on parempi kuin enemmän Vähemmän ylläpidettävää Vältä etenkin toistoa Poista käyttämättömiksi jääneet muuttujat/metodit Ymmärrettävyys kuitenkin etusijalla Kapseloi Muutokset itsenäisissä osioissa aiheuttavat vähemmän muutostarvetta muualla Vältä ennakkoehtoja (esim.:) Metodit suoritettava tietyssä järjestyksessä Metodin saa suorittaa vain kerran 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 13) Ylläpidettävyys Kirjoita koodillesi testit Mieti milloin kannattaa testata metodeja, milloin rajapintoja Esim. avaimen lisäys hajatustauluun / pakkaus ja pakkauksen purku Vältä pikapaikkauksia Ne kostautuvat aina jossain välissä Defensive programming 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 14) Defensive Programming Mieti miten kirjoittamaasi metodia tai luokkaa voitaisiin käyttää väärin Todennäköisesti väärinkäyttö johtuu väärinymmärryksestä Koodin käyttäjä kutsuu metodeja A ja B väärässä järjestyksessä Käytetään vääräntyyppisiä parametreja jne...mutta omat ohjelmointivirheetkin saattavat hyvin kutsua metodeja laittomilla arvoilla... ja varaudu näihin tapauksiin Jos mahdollista, rakenna koodi niin että sitä ei voi väärinkäyttää tai tarkista metodien syötteet jne. Helpottaa virheiden löytämistä : Jos metodia kutsutaan väärillä arvoilla, niin virhe ei ilmaannu metodin sisällä -> osataan aloittaa kutsuvasta koodista 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 15) Defensive Programming Työkalut if-lauseet ja poikkeukset Jos metodilla on rajoitteita sen suhteen millaisia parametreja se voi ottaa vastaan, kannattaa ne tarkistaa ja tarvittaessa heittää poikkeus tai palauttaa jokin metodin dokumentaatiossa sovittu arvo. assertiot Pythonissa on PyUnit:in assertxxx komentoja vastaava oma assert -käsky, joka toimii jotakuinkin vastaavalla tavalla. Paikkoihin, joissa muuttujien arvojen tulee ehdottomasti olla tietyissä rajoissa voi kirjoittaa assertioita, jotka katkaisevat ohjelman suorituksen virhetilanteessa. Nämä voi kytkeä pois käännettäessä testaus Kokeile käyttää luokkaasi väärin ja katso ettei se onnistu. 11:08

Ylläpidettävyys Kirjoita itsensä selittävää koodia Valitse muuttujien ym. nimet niin, että ne jo itsessään kertovat käyttötarkoituksen Nimien kierrätys Harkitse tarkkaan Älä kikkaile Usean asian tunkeminen mahdollisimman lyhyeen tilaan voi tuntua hienolta mutta... Kuinka kauan lukijalta menee sen ymmärtämiseen saati sitten muuttamiseen Älä kopioi koodia Sama koodinpätkä parissa paikassa tekemässä hieman eri asioita Yhteinen osuus omaan metodiin 11:08 (ei-laajan kurssin kalvo: luento 11 sivu 16)

(ei-laajan kurssin kalvo: luento 11 sivu 18) PEP 8 Pythonin tyyliohje antaa hyvän pohjan hyvänlaatuiselle koodille: http://www.python.org/dev/peps/pep-0008/ Tuloksena ymmärrettävää koodia Ja näin ollen myös ylläpito helpottuu 11:08

Sisältö 1 Suunnittelumalli Observer 2 Suunnittelumalli Adapter 3 Suunnittelumalleja: Composite ja Double-dispatch 4 Suunnittelumalleja: Command, Strategy ja Template Method 5 Sekalaista ohjelmien laadusta 6 Säännölliset lausekkeet

Säännölliset lausekkeet säännöllinen lauseke (regular expression) on tapa kuvata hahmo, joka sopii tietynlaisiin merkkijonoihin esim. ab*c sopii merkkijonoihin ac, abc, abbc, jne. näitä käytetään tekstimuotoisen datan käsittelyssä esim. tunnistamaan tietynlaisia rivejä tai jakamaan rivi osiin niille on tukea melkein kaikissa ohjelmointikielissä skriptikielissä (varsinkin Perl) niille on lyhyempi syntaksi ja niitä käytetään enemmän valitettavasti lausekkeiden syntaksi vaihtelee hieman eri kielissä samoin monissa (ohjelmointi-)editoreissa sekä ohjelmien konguraatiotiedostoissa ja mm. grep-komentorivityökalussa editoreissa haku- ja korvaustoimintojen lisäksi mm. syntaksin väritys tehdään useimmiten säännöllisillä lausekkeilla säännöllisillä lausekkeilla ei voi tunnistaa kaikkea yleensä ei rekursiivisia rakenteita esim. ohjelmointikielistä avainsanoja mutta ei sisäkkäisyyttä

Säännöllisten lausekkeiden syntaksi useimmiten säännöllisiä lausekkeita käytetään hakemiseen lauseke kuvaa osaa etsittävästä tekstistä (usein rivistä) kirjaimet jne. tavalliset merkit sopivat itseensä esim. ab sopii vain merkkijonoon ab Yleisimmät erikoismerkinnät. mikä tahansa yksi merkki [a-f] yksi kirjaimista a,b,c,d,e,f [^a-f] mikä tahansa paitsi a,b,c,d,e,f * edellinen lausekkeen osa 0 kertaa + edellinen lausekkeen osa 1 kertaa? edellinen lausekkeen osa 0 tai 1 kertaa \? merkki? (samoin \*, \. jne.) ^ tämä kohta on rivin alussa $ tämä kohta on rivin lopussa {2,4} edellinen lausekkeen osa 24 kertaa (foo bar) joko hahmo foo tai bar (tämän syntaksi vaihtelee hieman)

Esimerkkejä syntaksista Esimerkkilausekkeita [a-z]*=[0-9]* sopii esim. width=42 ^[a-za-z]+ *= *[0-9]+$ myös width = 42 ^def *[a-za-z]+\(object\): def Box(object): (data/)?[a-z]+\.txt data/koe.txt ja koe.txt syntaksi vaihtelee hieman eri toteutuksissa huom. säännöllinen lauseke on eri asia kuin komentotulkin tiedostonimihahmot! (eli ns. glob-hahmot) siellä? = mikä tahansa merkki, * = 0 mitä tahansa merkkiä esim. foo/*.txt eikä foo/.*\.txt

Tekstin korvaaminen skripteissä säännöllisiä lausekkeita käytetään usein tekstin korvaamiseen tai osien irrottamiseen korvaavassa tekstissä voi viitata suluilla merkittyihin säännöllisen lausekkeen osiin (usein \1 on ensimmäinen osa jne.) esim. hahmossa ^([a-za-z]+) *= *([0-9]+)$ ja tekstissä width = 42 ensimmäinen osa on width ja toinen 42 esim. Perlissä width = 42:n voisi muuttaa muotoon set width to 42 Perl-lausekkeella s/^([a-za-z]+) *= *([0-9]+)$/set \1 to \2/ (syntaksi on s/ säännöllinen lauseke / korvaava teksti /) korvaamisen sijaan suluilla merkityt osat voi ottaa talteen muuttujiin

Säännölliset lausekkeet Pythonissa Pythonin re-paketissa on säännöllisten lausekkeiden käsittelyä: säännöllisiä lausekkeita voi hakea merkkijonoista funktioilla re.match (sopiiko alkuun), re.search (etsii mistä tahansa), re.findall ja re.finditer (löytävät kaikki esiintymät) re.split jakaa merkkijonon osiin, re.sub korvaa tekstiä toisella jos käyttää saamaa säännöllistä lauseketta paljon, re.compile:lla voi kääntää sen tehokkaampaan muotoon ohje: http://docs.python.org/howto/regex.html Esimerkkejä Python-tulkissa >>> import re >>> re.search("[a-z]*=[0-9]*", "abcde") # palauttaa None >>> re.search("[a-z]*=[0-9]*", " width=42asdf").group() 'width=42' >>> re.search("([a-z]*)=([0-9]*)", "width=42").group(2) '42' >>> re.split("[,.]? *", "Foo, bar ja baz.") ['Foo', 'bar', 'ja', 'baz', ''] >>> re.sub("^([a-za-z]+) *= *([0-9]+)$", "set \\1 to \\2", "width =42") 'set width to 42'