Mustererkennung und Reguläre Ausdrücke in Perl

Werbung
Reguläre Ausdrücke / regular expression
=~ m/^[\w\-]+@[\.\w\-]+$/
P. Brezany
2
Mustererkennung und Reguläre Ausdrücke in Perl
http://de.wikipedia.org/wiki/Reguläre_Ausdrücke
http://en.wikipedia.org/wiki/Regular_expression
http://www.google.at/search?q=regex+perl
P. Brezany
3
Reguläre Ausdrücke in der theoretischen Informatik
Alternative
Aneinanderreihung
Wiederholung
0 oder 1
0 und 1
1n (n ≥ 0)
0+1
0.1
1*
0|1
01
11* = 1+
Beispiel:
Beispiel:
(0|1)*
(001)+
110000001…1111001100
001001001001001001001
P. Brezany
4
Reguläre Ausdrücke in der Praxis
84.141.73.125 - - [07/Feb/2006:16:30:48 +0100] "GET /~charlie/burka-girls/burka-girls/zeichnen.gif
HTTP/1.1" 200 17401 "http://www.horus.at/~charlie/burka-girls/index.php" "Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.1; Crazy Browser 1.0.5; .NET CLR 1.0.3705; .NET CLR
1.1.4322)" 21374
84.58.207.237 - - [07/Feb/2006:18:17:32 +0100] "GET /~charlie/fotos/down.gif HTTP/1.1" 200 79
"http://www.horus.at/~charlie/fotos/index.php" "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de)
AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8" 29228
84.58.207.237 - - [07/Feb/2006:18:17:32 +0100] "GET
/~charlie/fotos/private_fotos/archiv/iris_party01.jpg HTTP/1.1" 200 59489
"http://www.horus.at/~charlie/fotos/index.php" "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de)
AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8" 27171
…
P. Brezany
5
Perl (Practical Extraction and Report Language)
#!/usr/bin/perl
print "Hallo Welt! \n";
P. Brezany
6
Mustererkennung und Reguläre Ausdrücke in Perl
=~ m/MUSTER/
=~ s/MUSTER/TEXT/
split(MUSTER,STRING)
P. Brezany
7
Mustererkennung und Reguläre Ausdrücke in Perl
#!/usr/bin/perl
$satz = "Hallo Welt! \n";
if ($satz =~ m/Hallo/) {
print "Hallo gefunden!";
}
P. Brezany
8
Mustererkennung und Reguläre Ausdrücke in Perl
#!/usr/bin/perl
$satz = "Hallo Welt! \n";
$satz =~ s/Hallo/Tschau/;
print $satz;
P. Brezany
9
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "3 Engel für Charlie!";
$satz =~ m/a/;
⇒ true
matcht erstes kleines a im String
P. Brezany
10
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "3 Engel für Charlie!";
$satz =~ m/\d/;
⇒ true
matcht erste Ziffer (3) im String (digit)
P. Brezany
11
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "3·Engel für Charlie!";
$satz =~ m/\D/;
⇒ true
matcht erste Nicht-Ziffer (Leerzeichen nach 3 und vor E)
P. Brezany
12
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "3 Engel für Charlie!";
$satz =~ m/f[äöü]r/;
⇒ true
Zeichen-Klassen: z.B. [01], [äöü], [a-z], [^0-9]
matcht: fär oder för oder für im String
matcht nicht: füür oder fäöür oder fr oder FÜR
P. Brezany
13
Mustererkennung und Reguläre Ausdrücke in Perl
Zeichen, wie ^ $ ? . + * | [ ) \ / haben eine spezielle
Bedeutung in Muster und müssen, wenn sie als
normales Zeichen verwendet werden, mit einem
Backslash \ vor dem Zeichen maskiert werden.
P. Brezany
14
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "Nur 3 Engel für Charlie?";
$satz =~ m/^\?/;
⇒ false
matcht: ein Fragezeichen im String,
das am String-Anfang stehen muss
P. Brezany
15
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "Nur 3 Engel für Charlie?";
$satz =~ m/\?$/;
⇒ true
matcht: ein Fragezeichen im String,
das am String-Ende stehen muss
P. Brezany
16
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "3 Engel für Charlie???";
$satz =~ m/Engeln?/; ⇒ true
Das Fragezeichen bedeutet, dass
der Buchstabe vor dem Fragezeichen (n)
einmal oder keinmal vorkommen darf.
P. Brezany
17
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "3 Engel für Charlie???";
$satz =~ m/Ch.rlie/;
⇒ true
Der Punkt (Joker) kann für genau ein
beliebiges Zeichen stehen.
matcht:
Charlie, ChArlie, Ch1rlie, Ch%rlie, Ch rlie
matcht nicht: Chrlie, Chaarlie
P. Brezany
18
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "3 Engel für Charlie???";
$satz =~ m/Charlie\?+/;
⇒ true
matcht: Charlie?, Charlie????,…
$satz =~ m/Charlie\?*/;
matcht: Charlie auch ohne ?
P. Brezany
1 - n Fragezeichen
⇒ true
0 - n Fragezeichen
19
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "3 Engel für Charlie???";
$satz =~ m/Charlie\?{2,4}$/;
⇒ true
matcht: Charlie mit 2,3,oder 4 Fragezeichen
$satz =~ m/ChArLiE/i;
⇒ true
Das i macht das Muster case-insensitive,
also unempfindlich gegenüber
Groß- oder Kleinschreibung.
P. Brezany
20
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "Engel 1, Engel 2 und Engel 3 für Charlie!";
$satz =~ s/Engel/Teufel/;
$satz ist "Teufel 1, Engel 2 und Engel 3 für Charlie!";
$satz =~ s/Engel/Teufel/g;
$satz ist "Teufel 1, Teufel 2 und Teufel 3 für Charlie!";
P. Brezany
21
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "Teufel 1, Teufel 2 und Teufel 3.";
$satz =~ s/(\d)/v$1.1/g;
$satz = "Teufel v1.1, Teufel v2.1 und Teufel v3.1.";
Mit runden Klammern kann man Teile des Strings
abspeichern. Der gematchte Text des Musters im
ersten Klammernpaar wird in $1, der im Zweiten in $2
gespeichert usw.
P. Brezany
22
Mustererkennung und Reguläre Ausdrücke in Perl
$satz = "Engel A";
$satz =~ s/^(.)(.*)(.)$/$3$2$1/;
$satz ist "Angel E";
Der Ausdruck vertauscht den ersten und den letzten
Buchstaben.
^(.)
(.*)
(.)$
speichert den ersten Buchstaben
speichert die mittleren Buchstaben
speichert den letzten Buchstaben
P. Brezany
in $1
in $2
in $3
23
=~ m/^[\w\-]+@[\.\w\-]+$/
P. Brezany
24
Mustererkennung und Reguläre Ausdrücke in Perl
Beispiel: E-Mail Adresse?
$email =~ m/^[\w\-]+@[\.\w\-]+$/;
Beispiel: Österreichische Postleitzahl?
$plz =~ m/A\s*-\s*\d{4}$/;
Beispiel: whitespace vorne und hinten entfernen…
$name =~ s/^\s*(.*?)\s*$/$1/;
P. Brezany
25
\n
\t
\w
\W
\d
\D
\s
\S
\b
\B
.
^
$
*
*?
+
+?
?
[abc]
[^ab]
[a-z]+
|
() $1
{2,4}
\i
\g
- Zeilenumbruch
- Tabulator
- Irgendein alphanumerischer (word) Buchstaben; [a-zA-Z0-9_]
- nicht alphanumerisch (non-word); ist identisch mit [^a-zA-Z0-9_]
- Eine Zahl. Ist identisch mit [0-9]
- Keine Zahl. Ist identisch mit [^0-9]
- 'whitespace character': space, tab, newline, etc
- 'non-whitespace character'
- Wortgrenze (nur ausserhalb [ ])
- Innerhalb eines Wortes
- Ein einzelner Buchstaben ohne newline
- Zeilen- oder Stringanfang (nur außerhalb von [ ])
- Zeilen- oder Stringende
- Null oder mehrere Male den letzten Buchstaben (gierig / greedy)
- Null oder mehrere Male den letzten Buchstaben (minimal)
- Ein oder mehrere Male den letzten Buchstaben (gierig / greedy)
- Ein oder mehrere Male den letzten Buchstaben (minimal)
- Null oder ein Mal den letzten Buchstaben
- a oder b oder c
- weder a noch b
- Irgendeine Folge von Kleinbuchstaben
- entweder oder; z.B.: (eg|le)gs Entweder eggs oder legs
- Teil des Strings merken
- Quantifier
- ignore case (nach Muster)
- greedy (nach Muster)
P. Brezany
26
Mustererkennung und Reguläre Ausdrücke in Perl
Aufgabe 1:
$bilder = "1.jpg, 2.jpeg, 3.JPEG, 4.JPG";
Bringen Sie die Endungen der Dateien in ein
einheitliches Format.
(Textersetzung mit =~ s/MUSTER/TEXT/)
P. Brezany
27
Mustererkennung und Reguläre Ausdrücke in Perl
Aufgabe 2:
if ( $email =~ m/(:|;)-\)/ ) { print "Smile!"; }
Welches Muster wird hier erkannt?
Wann wird Smile! ausgegeben?
P. Brezany
28
Mustererkennung und Reguläre Ausdrücke in Perl
Aufgabe 3:
Erkennen Sie das grundsätzliche Format eines
UNET-Logins. (also: a und Matrikelnummer
z.B.: a0409142).
Folgende Regeln gilt es einzuhalten:
Ein UNET-Login beginnt mit einem a.
Danach folgen 7 (beliebigen) Ziffern.
P. Brezany
29
Mustererkennung und Reguläre Ausdrücke in Perl
Aufgabe 4:
Prüfen Sie ob der Name einer skalaren Variable in Perl
korrekt ist. (z.B.: $var, $Nachname, $x_11)
Folgende Regeln gilt es einzuhalten:
Skalar-Variablen beginnen mit einem $-Zeichen.
Variablen-Namen bestehen aus (englischen) Buchstaben,
Zahlen und Unterstrichen.
Nach dem $ muss ein Buchstabe stehen.
P. Brezany
30
Mustererkennung und Reguläre Ausdrücke in Perl
Aufgabe 5:
$var = "Hände, Strände, Bände";
Ersetzen Sie ä durch ae.
P. Brezany
31
Mustererkennung und Reguläre Ausdrücke in Perl
Aufgabe 6:
$email =~ m/^[\w\-]+@[\.\w\-]+$/;
Dieser Ausdruck zum matchen von E-Mail Adressen ist
nicht perfekt. Suchen Sie Beispiele für
a) gültige / vernüftige / realistische E-Mail
Adressen, die nicht gematcht werden.
b) unsinnige / unrealistische E-Mail Adressen,
die gematcht werden.
P. Brezany
32
GREP Program (Unix/Linux Utility)
P. Brezany
33
Mustererkennung und Reguläre Ausdrücke mit grep
grep ist ein Unix-Programm
das nach Muster in Dateien sucht
Zeilen die das Muster enthalten werden ausgegeben
P. Brezany
34
My dog's got no nose.
How does he smell?
Awful.
Mustererkennung und Reguläre Ausdrücke mit grep
Optionen:
grep -v
grep -n
grep -i
grep -l
grep -c
grep -A 3
grep -E
alle Zeilen die nicht das Muster enthalten
mit Zeilennummer vor der Zeile
ignoriert Groß/Kleinschreibung
gibt (nur) den Dateinamen aus
gibt (nur) die Anzahl der Zeilen
gibt nach der Zeile noch 3 weitere Zeilen aus
oder egrep:
erweiterte regex
grep -niA 1 SMELL joke1
2:How does he smell?
3-Awful.
P. Brezany
man grep
35
My dog's got no nose.
How does he smell?
Awful.
Mustererkennung und Reguläre Ausdrücke mit grep
[A-Z] [a-z] [0-9] sind Zeichenklassen:
grep '[Oo]' joke1
My dog's got no nose.
How does he smell?
P. Brezany
36
My dog's got no nose.
How does he smell?
Awful.
Mustererkennung und Reguläre Ausdrücke mit grep
grep 'l\{2\}' joke1
How does he smell?
Der Ausdruck vor
\{n\}
kommt n Mal vor
\{n,\} kommt mindestens n Mal vor
\{n,m\} kommt n bis m Mal vor
P. Brezany
37
Mustererkennung und Reguläre Ausdrücke mit grep
^Zeilenanfang und Zeilenende$
grep '^$' joke1
findet alle Leerzeilen
übrigens: ^ ist der Zirkumflex oder das Caret
P. Brezany
38
Mustererkennung und Reguläre Ausdrücke mit grep
.
*
\
- irgendein beliebiges Zeichen
- null oder mehrere Male den letzten Ausdruck
- zum maskieren von 'Sonderzeichen'
P. Brezany
39
Mustererkennung und Reguläre Ausdrücke mit egrep
grep -E oder egrep: erweiterte Reguläre Ausdrücke
+
?
|
()
- ein oder mehrere Male den letzten Ausdruck
- null oder ein Mal den letzten Ausdruck
- entweder oder
- z.B.: (eg|le)gs : Entweder eggs oder legs
P. Brezany
40
-
P. Brezany
41
Herunterladen