Perl-Praxis.

Ähnliche Dokumente
Perl-Praxis. Jörn Clausen

Perl-Praxis. Jörn Clausen

/ Vortrag Unix-AG

(Prüfungs-)Aufgaben zu formale Sprachen

Stream EDitor SED und Reguläre Ausdrücke

Reguläre Ausdrücke. Felix Döring, Felix Wittwer 14. November Python-Kurs

Einführung in PERL 2 Reguläre Ausdrücke

Reguläre Ausdrücke Suchmuster, Pattern Matching

/ Software Freedom Day

Webengineering. Reguläre Ausdrücke. Dienstag, 2. Juli 13

Informationsextraktion Materialien zur Vorlesung

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

Reguläre Ausdrücke mit Java

Eine Beschreibung des Programms und der dahinter stehenden Philosophie.

Einführung in die Computerlinguistik Suche mit regulären Ausdrücken

Perlkurs WS 14/15 Reguläre Ausdrücke I

Shell-Programmierung

Ein- und Ausgabeumlenkung

Öffnen einer Datei. Programm mit einer Fehlermeldung beendet. open( IN, "datei.txt" ) or die( "open-fail: $!" );

Perl-Praxis. Einführung. Jörn Clausen, Jan Krüger Jens Reeder, Alex Sczyrba. AG Praktische Informatik Technische Fakultät Universität Bielefeld

Linux II. Reguläre Ausdrücke Editoren Scripting. 2 Linux II. Linux I II III Res WN/TT NLTK XML Weka E Reguläre Ausdrücke Editoren Scripting

Reguläre Ausdrücke. Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik

Perl-Praxis. Dateien und Daten. Jörn Clausen Daniel Hagemeier, Jan Krüger

Linux I II III Res/Pro WN/TT Reguläre Ausdrücke Editoren Scripting. Linux II. 2 Linux II. Reguläre Ausdrücke Editoren Scripting. Ressourcen-Vorkurs

Kommandozeileneingabe. Einführung in Perl Kommandozeileneingabe etc. Kommandozeileneingabe Optionen. Kommandozeileneingabe Bsp (1)

Was bisher geschah: Formale Sprachen

Einführung in Perl Übersicht Operatoren Mustersuche I Autoinkrement und Autodekrement Autoinkrement und Autodekrement Bsp

Programmierkurs Kapitel 4

Grundlagen der Theoretischen Informatik

PERL. Eine Einführung. von Serap Tekke & Elif Öner

C/C++ Programmierung

Theorie der Informatik. Theorie der Informatik. 6.1 Einführung. 6.2 Alphabete und formale Sprachen. 6.3 Grammatiken. 6.4 Chomsky-Hierarchie

1.103 Regular Expressions - Reguläre Ausdrücke

Effizientes Arbeiten mit dem Emacs. Suchen und Ersetzen.

Programmieren lernen mit Groovy Strings, GStrings, Textverarbeitung

Grammatiken. Eine Grammatik G mit Alphabet Σ besteht aus: Variablen V. Startsymbol S V. Kurzschreibweise G = (V, Σ, P, S)

Grammatik der Genome

Formale Sprachen und Automaten

Was bisher geschah Chomsky-Hierarchie für Sprachen: L 0 Menge aller durch (beliebige) Grammatiken beschriebenen Sprachen L 1 Menge aller monotonen

Komplexe Datenstrukturen

Theorie der Informatik

XML Extensible Markup Language

Programmieren mit sockets

Reguläre Ausdrücke in Python

Formale Sprachen. Anwendungen formaler Sprachen Adressen, Kaffeeautomaten, Programmiersprachen. Rudolf Freund, Marian Kogler

javascript Coding-Guidelines 2. Ausgabe Februar 2015 Der Guideline beschreibt den verwendeten Coding-Stil von javascript als eigene Richtline.

Perl-Praxis. Dateien und Daten. Jörn Clausen, Jan Krüger Jens Reeder, Alex Sczyrba. AG Praktische Informatik Technische Fakultät Universität Bielefeld

Perl-Praxis. Einführung.

Einführung in Perl. O'REILLY Beijing Cambridge Farnham Köln Sebastopol Taipei Tokyo. Randal L. Schwartz, Tom Phoenix & brian dfoy

IT-Zertifikat: Allgemeine Informationstechnologien II PHP

XML Extensible Markup Language

Ferdinand Beyer. 1 Allgemeines Beschreibung Bezeichnungen Einsatzgebiete in UNIX-Tools Notationsarten...

C. Ortseifen: Reguläre Ausdrücke

Perl-Praxis. CGI-Skripte. Madis Rumming, Jan Krüger.

Grundlagen der Theoretischen Informatik

Empfehlenswerte Referenzen

JavaScript und PHP-Merkhilfe

Komplexe Datenstrukturen

Übersicht. Einführung in Perl Datenstrukturen I. Datentypen Übersicht (1) Kernbegriffe. Kernbegriffe. Einführung der Datentypen.

Beispiel 19. December 4, 2009

Netzwerke. Netzwerk-Programmierung. Sven Hartmeier.

SQL. SQL SELECT Anweisung SQL-SELECT SQL-SELECT

Lexikalische Programmanalyse der Scanner

Beschreibungskomplexität von Grammatiken Definitionen

ACÖ - Martin Kästner Perl fürs Web. Galileo Computing

Grundlagen der Theoretischen Informatik

Kapitel 2: Formale Sprachen Gliederung

O'REILLY 8 Beijing Cambridge Farnham Köln Sebastopol Taipei Tokyo. Reguläre Ausdrücke Kochbuch. Jan Goyvaerts & Steven Levithan

Kapitel: Die Chomsky Hierarchie. Die Chomsky Hierarchie 1 / 14

Mathematische Grundlagen der Informatik 2

Python Programmierung. Dipl.-Ing.(FH) Volker Schepper

Rechnernetze. 6. Übung

POP3-Protokoll Eine kurze Erklärung. Johannes Mayer SAI, Universität Ulm Juni 2001

Martin Kästner Perl fürs Web

GREP. Reguläre Ausdrücke. GREP Hardcore. Syntax. Ersetzen Suchen. Look Around. 20. April 2012 Pubkon 2013

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Grundlagen der Theoretischen Informatik / Einführung in die Theoretische Informatik I

Tutorium Reguläre Ausdrücke/Code Munger

Excel VBA Arrays, Enumeration und benutzerdefinierte Typen

b{2} [^b]{2} Reguläre Ausdrücke als Hilfsmittel der Textanalyse Manuel Raaf Bayerische Akademie der Wissenschaften, IT-Referat

6 Ein- und Ausgabe. Bisher war unsere (Bildschirm-) Ausgabe leichtflüchtig (

Einstieg in die Informatik mit Java

Regular Expressions. Daniel Lutz Was ist eine Regular Expression?

Tokenisierer Überblick

Einstieg in die Informatik mit Java

3 Variablen. 3.1 Allgemeines. 3.2 Definition und Verwendung von Variablen

9 Block 9: Von der Idee zum Programm: Restrict.pl

Objektorientierte Programmierung. Kapitel 3: Syntaxdiagramme und Grammatikregeln

Einführung in die Informatik Grammars & Parsers

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 23

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

10 Block 10: Verwendung von Modulen in Perl

Theoretische Grundlagen 1

Dateisystem 2, Suchen & Finden

Theoretische Informatik I

Grundbegriffe der Informatik Tutorium 12

Theoretische Informatik Mitschrift

Grundlagen der Informatik Vorlesungsskript

Lua - Erste Schritte in der Programmierung

Erwin Grüner

Transkript:

Perl-Praxis Reguläre Ausdrücke Jörn Clausen joern@techfak.uni-bielefeld.de 1

Übersicht Reguläre Ausdrücke Muster suchen Muster finden 2

zur Erinnerung Perl := Practical Extraction and Report Language Text-Dateien zeilenweise einlesen Zeilen nach Mustern durchsuchen in Worte zerlegen Textstücke ersetzen 3

Reguläre Ausdrücke beschreiben einfache Sprachen schwächste Chomsky-Grammatik in Perl: regular expressions (RE) REs in Perl deutlich mächtiger als Reguläre Sprachen Die Chomsky-Hierarchie: Typ-0-Sprachen Typ-1-Sprachen Typ-2-Sprachen Typ-3-Sprachen allgemeine Regelsprachen kontextsensitive Sprachen kontextfreie Sprachen reguläre Sprachen 4

regular expressions Suchen: m/gold/ Kurzform: /Gold/ Ersetzen: s/blei/gold/ RE an Ausdruck binden: = (match operator) $story = In a hole in the ground there lived a boggit. ; if ($story = /ground/) {... $story = s/boggit/hobbit/; Wenn der Suchausdruck mit m eingeleitet wird, kann (fast) jedes beliebige andere Zeichen anstatt des slash als Klammer verwendet werden. Dies sind alles äquivalente Ausdrücke: m#gold# m Gold m!gold! Dies ist vor allem dann Hilfreich, wenn der slash Teil des Suchmusters ist, z.b. wenn Verzeichnispfade oder URLs verarbeitet werden sollen. Sonst müßte ein slash, der nicht Begrenzer des Suchmusters ist, als \/ maskiert werden. Analog gilt dies für die Ersetzung mit s///. 5

modifier beeinflussen Verhalten von m// und s/// nur die zwei wichtigsten: m/gold/i s/blei/gold/g # case insensitive # global 6

Aufgaben Wir verwenden im weiteren Verlauf die Dateien romeo.txt und eric.txt, um Texte zu suchen und zu manipulieren. Es handelt sich um Theaterstücke von Wayne Anthoney. Siehe http://www.dramex.org Wieviele Zeilen von romeo.txt enthalten das Wort Gold? Ersetze in eric.txt das Wort Estragon durch Basil und Vladimir durch Ilyich. Nach Gold suchen: $count = 0; open(drama, romeo.txt ) die "can t open romeo.txt: $!\n"; while ($line = <DRAMA>) { $count++ if $line = /gold/i; close(drama); print "found $count lines of pure gold\n"; Die Datei enthält sieben mal das Wort gold und neun mal das Wort Gold. Namen ersetzen: open(drama, eric.txt ) die "can t open eric.txt: $!\n"; while ($line = <DRAMA>) { $line = s/estragon/basil/g; $line = s/vladimir/ilyich/g; print $line; close(drama); 7

regular expressions, cont. Alternativen: m/huey Dewey Louie/ Gruppierung: m/(hu Dew)ey Louie/ Quantoren m/ab?a/ # aa, aba m/ab*a/ # aa, aba, abba, abbba, abbbba,... m/ab+a/ # aba, abba, abbba, abbbba,... m/ab{3,6a/ # abbba, abbbba, abbbbba, abbbbbba m/a(bab)+a/ # ababa, ababbaba, ababbabbaba,... 8

regular expressions, cont. Zeichenklassen m/hello\s+world/ m/es ist \d+ Uhr/ m/name: \w+/ # whitespace # digits # letters (words) Gegenteile : \S, \D, \W selbstgemachte Zeichenklassen m/m[ea][iy]er/ m/[a-z]{2,8/ m/[a-z][ˆ0-9]+/ # Meier, Meyer, Maier, Mayer # Account-Namen paßt auf alles:. 9

Aufgaben Lies die Datei /etc/services zeilenweise ein. Gib alle Zeilen aus, die sich auf das Protokoll TCP beziehen. Gib alle Zeilen aus, die einen Service definieren (also keine Kommentarzeilen sind). Gib alle Zeilen aus, die eine vier- oder fünfstellige Port-Nummer enthalten. Protokoll TCP : while ($line = <SERV>) { # print $line if $line = /tcp/; print $line if $line = /\d+\/tcp/; Im Prinzip reicht es, nach dem Text tcp zu suchen. Zur Sicherheit sollte aber nach der Kombination Portnummer/tcp gesucht werden. Kommentarzeilen herausfiltern: while ($line = <SERV>) { print $line if $line = /\w+\s+\d+\/(tcp udp)/; Es reicht nicht, einfach nach # zu suchen, da Kommentare auch in Zeilen vorkommen, die einen Service definieren. Daher wird das Muster einer Service-Definition zur Suche verwendet: Name, Leerzeichen, Ziffern, Slash, tcp oder udp. Vier- oder fünfstellige Portnummer: while ($line = <SERV>) { print $line if $line = /\d{4,5\/(tcp udp)/; 10

Anker Muster an bestimmte Position binden Zeilenanfang, Zeilenende: m/ˆfrom:.+/ s/\s+$// m/ˆ\d+ \d+ \d+$/ # mail header # remove trailing whitespace # 3d coords Wortzwischenraum: m/\bmit\b/ m/\bmit\b/ # "nicht mit mir", "Kommen Sie mit!" # "mittendrin", nicht "vermitteln" 11

Aufgaben Vereinfache das Skript, das alle Kommentarzeilen aus /etc/services herausfiltert. Extrahiere alle Zeilen aus romeo.txt, in denen die Worte club oder clubs vorkommen, aber nicht clubroom. Suche nach #, die am Zeilenanfang stehen: while ($line = <SERV>) { next if $line = /ˆ#/; print $line; club und clubs, aber nicht clubroom : while ($line = <DRAMA>) { print $line if $line = /clubs?\b/; 12

pattern capturing bis jetzt: Muster kommt in Text vor! aber: Wie sah der Treffer aus? interessanten Bereich markieren: m/ˆfrom: (.+)/ m/ˆ(\d+) (\d+) (\d+)$/ Treffer landen in $1, $2,... $line = m/ˆ(\d+) (\d+) (\d+)$/; print "point at $1,$2,$3\n"; Quantoren richtig setzen: (\w)+ vs. (\w+) 13

Aufgaben In romeo.txt finden sich Regieanweisungen der Form ROMEO enters Extrahiere die Namen der Personen, die auf diese Weise die Bühne betreten. Regieanweisungen: while ($line = <DRAMA>) { if ($line = /([A-Z]+\s*[A-Z\.]+)\s+enters/) { print "$1\n"; Bei einfacheren Mustern werden z.b. DOC LAWRENCE oder MR.J nicht gefunden. 14

pattern capturing, cont. etwas eleganter: mit Zuweisung ($x, $y, $z) = ($line = m/ˆ(\d+) (\d+) (\d+)$/); Muster muß vollständig passen if (defined($x)) { print "point at $x,$y,$z\n"; Unterschied zwischen grouping und capturing: ($dir, $who) = ($header = m/ˆ(from To): (.+)/); ($who) = ($header = m/ˆ(?:from To): (.+)/); 15

Aufgaben Lies /etc/services ein. Stelle die Informationen über die Dienste etwas umgangssprachlicher dar. Für die Zeile ftp 21/tcp soll folgende Ausgabe erzeugt werden: der Dienst "ftp" verwendet TCP auf Port 21 Eventuelle weitere Informationen (Alias-Namen oder Kommentare) sollen ignoriert werden. Wie häufig kommen die Worte Estragon und Vladimir jeweils in eric.txt vor? Service-Liste formatieren: while ($line = <SERV>) { ($serv, $port, $prot) = ($line = /ˆ(\S+)\s+(\d+)\/(tcp udp)/); if ($serv) { print "der Dienst \"$serv\" verwendet ",uc($prot), " auf Port $port.\n"; Namen zählen: ($estragon, $vladimir) = (0, 0); while ($line = <DRAMA>) { @estragon = ($line = /Estragon/gi); $estragon += @estragon; @vladimir = ($line = /Vladimir/gi); $vladimir += @vladimir; print "found $estragon Estragons and $vladimir Vladimirs\n"; 16

greedy matches Was passiert, wenn pattern nicht eindeutig ist? $text = "aaaaaaaaaa"; ($w1, $w2) = ($text = /(a+)(a+)/); ausprobieren: /(a+)(a*)/ /(a*)(a+)/ /(a*)(a*)/ /(a?)(a*)/ /(a{2,4)(a*)/ Setze? hinter den ersten quantifier: +? *??? {2,4? greedy: + +: >>aaaaaaaaa<< >>a<< + *: >>aaaaaaaaaa<< >><< * +: >>aaaaaaaaa<< >>a<< * *: >>aaaaaaaaaa<< >><<? *: >>a<< >>aaaaaaaaa<< {2,4 *: >>aaaa<< >>aaaaaa<< non-greedy: +? +: >>a<< >>aaaaaaaaa<< +? *: >>a<< >>aaaaaaaaa<< *? +: >><< >>aaaaaaaaaa<< *? *: >><< >>aaaaaaaaaa<<?? *: >><< >>aaaaaaaaaa<< {2,4? *: >>aa<< >>aaaaaaaa<< 17

Text zerteilen join: Array-Elemente zu String vereinen entgegengesetzte Operation: split Trennung durch pattern: $story = "In a hole in the ground there lived a hobbit."; @words = split(/\s/, $story); 18

Aufgaben Trenne den Satz In a hole in the ground there lived a hobbit. mit den folgenden Mustern. Welche Worte entstehen dabei? / / // /\s*/ /\b/ /\B/ Wie groß sind die patterns, an denen getrennt wird? verschiedene Trennmuster: / / In a hole in the ground there lived a hobbit. // I n a h o l e i n t h e g r o u n d t h e r e l i v e d a h o b b i t. /\s*/ I n a h o l e i n t h e g r o u n d t h e r e l i v e d a h o b b i t. /\b/ In a hole in the ground there lived a hobbit. /\B/ I n a h o l e i n t h e g r o u n d t h e r e l i v e d a h o b b i t. Das pattern / / ist ein Zeichen groß. Die patterns //, /\b/ und /\B/ haben keine Ausdehunng. Das pattern \s* hat variable Größe. 19