...

Programmierkurs für absolute Anfänger

by gafna

on

Report

Category:

Documents

Download: 0

Comment: 0

25

views

Comments

Description

Programmierkurs für absolute Anfänger.  Reguläre Ausdrücke / regular expressions. http://www.coli.uni-saarland.de/~cabr/teaching.php. Caren Brinckmann Sommersemester 2005. Wozu braucht man das? (1). Wozu braucht man das? (2). - PowerPoint PPT Presentation
Download Programmierkurs für absolute Anfänger

Transcript

  • Programmierkurs für absolute Anfänger http://www.coli.uni-saarland.de/~cabr/teaching.php  Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester 2005 Sprachsynthese - Ein Überblick
  • Wozu braucht man das? (1) Sprachsynthese - Ein Überblick
  • Wozu braucht man das? (2) if (($laut eq "p") || ($laut eq "t") || ($laut eq "k") || ($laut eq "b") || ($laut eq "d") || ($laut eq "g")) { print "$laut ist ein Plosiv!"; } kürzer: if ($laut =~ /^[ptkbdg]$/) { print "$laut ist ein Plosiv!"; } Sprachsynthese - Ein Überblick
  • Was sind reguläre Ausdrücke? (1) Reguläre Ausdrücke (RA) sind genau definierte Suchmuster für Zeichenfolgen (d.h. einzelne Zeichen und Zeichenketten). Mit RA kann man nach Zeichenfolgen suchen, die dem jeweiligen Suchmuster entsprechen, und sie weiterverarbeiten (ersetzen, umformatieren, konkatenieren, ...). Außerdem kann man Bedingungen in Programmen an reguläre Ausdrücke knüpfen. if ($laut =~ /^[ptkbdg]$/) { print "$laut ist ein Plosiv!"; } Sprachsynthese - Ein Überblick
  • Was sind reguläre Ausdrücke? (2) Ein RA ist also eine Beschreibung, die auf eine ganze Menge von Zeichenfolgen passt. Was bedeutet das konkret? Am besten lernen durch viele Beispiele! Wo werden RA in der Praxis eingesetzt? UNIX-Kommandozeilentools: grep, sed, awk, ... Texteditoren: XEmacs, TextPad, ... Programmiersprachen: Perl, Python, Java, ... Shells (eingeschränkt): bash, Windows-Konsole, ... Sprachsynthese - Ein Überblick
  • Einfache RA in Perl Ein RA wird in Perl zwischen zwei Schrägstriche eingeschlossen: /a/ Wenn ein RA auf eine Zeichenfolge passt, so sagt man auch „der reguläre Ausdruck matcht die Zeichenfolge“. Bsp: /a/ matcht die Zeichenfolge "a" aber auch das 'a' in "Hallo". Zeichen- und Zeichenkettenliterale: /a/ Alabama liegt in Amerika. /a / Alabama liegt in Amerika. /haben/ Wir haben keinen Zucker mehr. Haben Sie welchen? Leerzeichen und Groß-/Kleinschreibung beachten! Sprachsynthese - Ein Überblick
  • Matching Operator =~ Um einen regulären Ausdruck mit einer Zeichenkette zu vergleichen, benötigt man den sogenannten Matching Operator: =~ $wort = "Hans"; if ($wort =~ /an/) { print "match!\n"; } else { print "kein match!\n"; } Sprachsynthese - Ein Überblick
  • Sonderzeichen Ein RA besteht aus Literalen (also: wörtlich zu interpretierenden Zeichen und Zeichenketten), und aus folgenden Sonderzeichen, die eine spezielle Bedeutung haben: \ . ^ $ + ? * { } ( ) [ ] | D.h., wenn eins dieser Sonderzeichen wörtlich gesucht werden soll, so muss es mit einem vorangestellten \ (backslash) "entwertet" werden, z.B. /2\$/ matcht Das kostet 2$. /2$/ matcht nicht Das kostet 2$. Übung: [2] ja? 2.3 (oder?) \abc\ Sprachsynthese - Ein Überblick
  • Sonderzeichen: Wildcard . Der Punkt . steht für genau ein beliebiges Zeichen (Ausnahme: Zeilentrennzeichen \n). /a./ Maria mag Anna Übung: /mar.o/ matcht welche Teile? marco, amarzo, marsio, Mario, amar ono, schmargo, ammarkoni, marrko Übung: Konstruiere einen regulären Ausdruck, der auf alle Zeichenketten unter a) passt (also Zeichenkettenteile matcht), aber keine der Zeichenketten unter b) akzeptiert: pit b) pt spot Pot spate peat slap two part respite Sprachsynthese - Ein Überblick
  • Sonderzeichen: Positionsmarker ^ und $ Das Caret-Zeichen ^ steht für den Anfang einer Zeichenkette. Das Dollar-Zeichen $ steht für das Ende einer Zeichenkette. /^Henning/ matcht Henning Meier /^Henning/ matcht nicht Meier Henning /Henning$/ matcht nicht Henning Meier /Henning$/ matcht Meier Henning Sprachsynthese - Ein Überblick
  • Sonderzeichen: Beispiel (1) while ($zeile = ) { if ($zeile =~ /^Wir/) { print $zeile; } } Wir wollen Eis essen. Das hat keine Wirkung. Wirkungsgrad ist Null. druck1.pl text1.txt Aufruf: perl –w druck1.pl < text1.txt Ausgabe? Sprachsynthese - Ein Überblick
  • Sonderzeichen: Beispiel (2) while ($zeile = ) { if ($zeile =~ /ung\.$/) { print $zeile; } } Die Bedienung kommt. Das hat keine Wirkung. Keine Ahnung! druck2.pl text2.txt Aufruf: perl –w druck2.pl < text2.txt Ausgabe? Sprachsynthese - Ein Überblick
  • Sonderzeichen: Wiederholungen ? + * ? bedeutet, dass das vorhergehende Zeichen keinmal oder einmal vorkommen kann (also: höchstens einmal) /hal?o/ matcht hao halo zhaloxxx /hal?o/ matcht nicht hallo + bedeutet, dass das vorhergehende Zeichen einmal oder mehrmals vorkommen kann (also: mindestens einmal) /hal+o/ matcht halo hallo halllo zhalllllloxxx /hal+o/ matcht nicht hao * bedeutet, dass das vorhergehende Zeichen keinmal oder beliebig häufig vorkommen kann /hal*o/ matcht hao halo hallo zhalllllloxxx Sprachsynthese - Ein Überblick
  • Sonderzeichen: Beispiel (3) while ($zeile = ) { if ($zeile =~ /Al+e/) { print $zeile; } } Alle trinken Bier. Briten trinken Ale. Alte Hasen! druck3.pl text3.txt Aufruf: perl –w druck3.pl < text3.txt Ausgabe? Sprachsynthese - Ein Überblick
  • Sonderzeichen: Beispiel (4) while ($zeile = ) { if ($zeile =~ /Al*t?e/) { print $zeile; } } Alle trinken Bier. Briten trinken Ale. Alte Hasen! Frau Aterer kommt. druck4.pl text4.txt Aufruf: perl –w druck4.pl < text4.txt Ausgabe? Sprachsynthese - Ein Überblick
  • Sonderzeichen: Beispiel (5) while ($zeile = ) { if ($zeile =~ /.+/) { print $zeile; } } Alle trinken Bier. Briten trinken Ale. Alte Hasen! druck5.pl text5.txt Aufruf: perl –w druck5.pl < text5.txt Ausgabe? Sprachsynthese - Ein Überblick
  • Sonderzeichen: Wiederholungen { } Die geschweiften Klammern { } werden benutzt, um eine exakte Anzahl {n} eine Mindestanzahl {n,} eine Mindest- und eine Höchstanzahl {n,m} von Zeichenwiederholungen zu suchen. /hal{2}o/ matcht xhalloy /hal{2}o/ matcht nicht xhallloy halo /hal{2,}o/ matcht hallo halllllox /hal{2,}o/ matcht nicht hao halo /hal{2,3}o/ matcht hallo halllox /hal{2,3}o/ matcht nicht halo hallllox Sprachsynthese - Ein Überblick
  • Zusammenfassung Sonderzeichen: Wiederholungen * keinmal oder beliebig oft + mindestens einmal ? höchstens einmal {n} genau n-mal {n,} mindestens n-mal {n,m} mindestens n-mal, aber maximal m-mal Äquivalenzen: * ist äquivalent zu {0,} + ist äquivalent zu {1,} ? ist äquivalent zu {0,1} Sprachsynthese - Ein Überblick
  • Übung 1) abc 2) ac 3) abbb 4) bbc 5) aabcd 6) b Welche Zeichenketten(teile) werden jeweils gematcht? /ab+c?/ /a?b*c/ /b+c*/ /^b+c*$/ /a.+b?c/ /b{2,}c?/ /^a{1,2}b+.?d*/ Sprachsynthese - Ein Überblick
  • Gruppierung: ( ) Mehrere Zeichen können mit runden Klammern gruppiert werden. Dadurch ist es möglich, die Wiederholungssonderzeichen nicht nur auf einzelne Zeichen, sondern auch auf Zeichenketten und eingebettete RA anzuwenden. /(ro)+/ matcht robo, rororo, brorok /h(al)*lo/ matcht hlo, hhalallo, halloi /ha(ll)?o/ matcht hao, hallo, ahaoi /(h?a)+lo/ matcht haahalo, aaalo, hahahalo, alo, halo Sprachsynthese - Ein Überblick
  • Übung Welche der folgenden Zeichenketten wird von /a(ab)*a/ gematcht? 1) abababa 2) aaba 3) aabbaa 4) aba 5) aabababa Sprachsynthese - Ein Überblick
  • Alternative Zeichenketten: | Mit dem Pipe-Zeichen | kann man mehrere alternative Zeichenketten angeben. /(Herr|Frau) Mayer/ matcht Herr Mayer, Frau Mayer /A(nn|ll)e/ matcht Anne, Alle /Hund|Katze|Maus/ matcht Hund, Katzen, Mausi if ($wort =~ /^(be|ent|er|ge|miss|ver|zer)/) { print "$wort beginnt mit einem Präfix!"; } Sprachsynthese - Ein Überblick
  • Zeichenmenge: [ ] Eine Menge von Zeichen in eckigen Klammern bedeutet, dass genau eins dieser Zeichen gesucht wird (egal welches). /mar[ckl]o/ matcht marco, marko, marlo matcht nicht marcko, marmo /M[ae][iy]er/ matcht Maier, Mayer, Meier, Meyer /a[ln]{2}e/ matcht alle, anne, alne, anle Sprachsynthese - Ein Überblick
  • Zeichenbereich: [ - ] Wenn genau ein Zeichen aus einem Zeichenbereich oder eine Ziffer aus einem Ziffernbereich gesucht wird, so verwendet man den Bindestrich in eckigen Klammern. /a[k-n]a/ matcht aka, ala, ama, ana /[A-Z][a-z]+/ matcht alle Zeichenketten mit einem Großbuchstaben gefolgt von mindestens einem Kleinbuchstaben /[0-9]{5}/ matcht alle fünfstelligen Dezimalzahlen (auch mit führenden Nullen) Sprachsynthese - Ein Überblick
  • Übung Welche der folgenden Zeichenketten wird von /^[A-Za-z ]+[\.\?!]$/ gematcht? Lauf! Der Gärtner mäht den Rasen. Wie lange warst Du in Rotenburg/Wuemme? Lisa sucht den Ball. Hast Du schon abgewaschen? Ich glaube ich spinne!? Sprachsynthese - Ein Überblick
  • Negation einer Zeichenauswahl: [^ ] Wenn am Anfang einer Zeichenmenge oder eines Zeichenbereichs das Caret-Zeichen ^ steht, so wird jedes Zeichen gematcht, das nicht zu der Menge bzw. dem Bereich gehört. Das Caret-Zeichen hat also zwei Bedeutungen! /a[^mnl]a/ matcht aga, a a, a9a, mara matcht nicht ama, ana, ala /^[^a-z]a/ matcht Mama, Larifari matcht nicht mama, alari, aMama Sprachsynthese - Ein Überblick
  • Nachlesen und Ausprobieren! http://www.tekromancer.com/perl2/7.html http://gnosis.cx/publish/programming/regular_expressions.html http://www.itri.brighton.ac.uk/ARCHIVE/courses/MScLex/exercises/regex/ http://www.regular-expressions.info/quickstart.html http://www.ifi.unizh.ch/cl/siclemat/lehre/ss01/pcl2/regextut Sprachsynthese - Ein Überblick Muss erkennen, wo das Wort „Schröder“ sich befindet und dieses durch „Schroeder“ ersetzen Sagen: die / / gehören nicht zum regulären Ausrdruck! Sagen: die / / gehören nicht zum regulären Ausrdruck! Sagen: die / / gehören nicht zum regulären Ausrdruck!
Fly UP