Einführung in Perl Verschachtelte Paare finden Dynamisches Regex
Transcription
Einführung in Perl Verschachtelte Paare finden Dynamisches Regex
Syntax Perl-Code wird innerhalb von Match ausgeführt Heike Zinsmeister (??{Perl-Code}) Ziel – beliebig tief verschachtelte paarige Ausdrücke erkennen – z.B. Klammerstrukturdarstellung von Parsebäumen IMS Dynamisches Regex-Konstrukt Einführung in Perl Verschachtelte Paare finden Resultat Regex-Objekt oder String, der als Regex interpretiert wird Resultat wird in laufende Mustersuche eingebaut Notwendigkeit – ‘Zählen’ von öffnenden und schließenden Klammern Heike Zinsmeister IMS Umsetzung – dynamisches Regex-Konstrukt Verschachtelungen IMS 1 Heike Zinsmeister Perl, 13.02.04 Perl, 13.02.04 IMS Perl, 13.02.04 2 Heike Zinsmeister Perl-Codemuster-Konstrukt Dynamisches Regex-Konstrukt – Bsp Syntax (?{Perl-Code}) Verschachtelungen nur Rückgabewert ist nicht Regex Rückgabewert z.B. print-Anweisung Default: Rückgabewert in Variable $ R wie dynamisches Regex-Konstrukt # x = freier Kommentar #! /usr/local/bin/perl -w while (<>){ chomp; if (/^ (\d+) (??{"X{$1}"}) $/x){ print "$_\n"; } } # Input: Ausgabe: # 1X >1X # 2X >3XXX # 3XXX >5XXXXXX # 4XXX # 5XXXXX # 6XXXXX Verschachtelungen 3 Perl, 13.02.04 Verschachtelungen 4 Heike Zinsmeister IMS IMS Problem: einfache Regex erkennt nur Paare einer bestimmten Verschachtelungstiefe qr-Operator quote regex qr-Operator: qr/PATTERN/ Einfache Regex und Paare zitiert und kompiliert PATTERN als regulären Ausdruck $text = "(S (NP Die Frau) (VP sieht (NP den Mann (PP mit dem Teleskop))))"; if ($text =~ m/( \( ( [^()] )* \) )/x ){ print "gefunden: $1\n"; } Heike Zinsmeister $regex = qr/my.String/is; $string =~ s/$regex/something else/; # Tiefe 0 # indentisch mit: $string =~ s/my.String/something else/is; $string =~ /drum.$regex.rum/; # so geht es nicht $string =~ /drum${regex}rum/; # aber so! print "Regex: $regex\n"; Verschachtelungen IMS 5 Heike Zinsmeister einfache Regex und Verschachtelung (1) Perl, 13.02.04 Perl, 13.02.04 # > Regex: (?si-xm:my.String) Verschachtelungen IMS 6 Heike Zinsmeister einfache Regex und Verschachtelung (2) erste Annäherung über eingebetteten Musteraufruf $text = "(S (NP Die Frau) (VP sieht (NP den Mann (PP mit dem Teleskop))))"; $text = "(S (NP Die Frau) (VP sieht (NP den Mann (PP mit dem Teleskop))))"; $Tiefe0 = qr/ \( ( [^()] )* \) /x; # geklammerter Text $Tiefe1 = qr/ \( ( [^()]| $Tiefe0 )* \) /x; # Verschachtelungstiefe 1 while ( $text =~m/ (\( ( [^()]| $Tiefe1 )* \)) /gx) { print "Auch: $1\n"; } if ($text =~ m/( $Tiefe0 )/x ){ print "gefunden: $1\n"; } $Tiefe2 = $Tiefe3 = # gierig, Kommentar # Ausgabe: #>Auch: (NP Die Frau) #>Auch: (VP sieht (NP den Mann (PP mit dem Teleskop))) # > gefunden: (NP Die Frau) qr/ (\( ( [^()]| $Tiefe1 )* \)) /x; # Verschachtelungstiefe 2 qr/ (\( ( [^()]| $Tiefe2 )* \)) /x; # Verschachtelungstiefe 3 # Tiefe 3, alternativ dargestellt: $text =~ m/(\(([^()]|\(([^()]|\(([^()]|\(([^()])*\))*\))*\))*\))/ Perl, 13.02.04 Verschachtelungen 7 Perl, 13.02.04 Verschachtelungen 8 Heike Zinsmeister IMS IMS dynamische Regex und Verschachtelung Heike Zinsmeister und noch etwas: tr/// (1) $Tiefe_N = undef; $Tiefe_N = qr/ ( \(( [^()] | (??{ $Tiefe_N }) )* \)) /x; # einfache oder beliebig verschachtelte Klammern Transliteration-Operator tr while ($text =~ m/($Tiefe_N)/g){ print "Neu gefunden:\n$1\n"; } # Ausgabe: #>Neu gefunden: #>(S (NP Die Frau) (VP sieht (NP den Mann (PP mit dem Teleskop)))) ersetzt Zeichen aus Suchliste mit Zeichen aus Ersetzungsliste tr/a-z/A-Z/; tr/Suchliste/Ersetzungsliste/; ist keine Regex; erlaubt keine Interpolation $string = "Ersetzung"; $string =~ tr/aeiou/!/; print "$string\n"; # ersetze Vokale mit ’!’ #> Ers!tz!ng $string = " Suche Whg., 4Zi. 90qm, 600W"; $count = ($string =~ tr/0-9//); # zaehle Ziffern # $count: 6 Verschachtelungen IMS 9 Heike Zinsmeister Perl, 13.02.04 Perl, 13.02.04 IMS 10 Heike Zinsmeister Was passiert mit dem Wert von $string aus dem letzten Beispiel? $string = " Suche Whg., 4Zi. 90qm, 600W"; $count = ($string =~ tr/0-9//); # kein Loeschen!! # $string: Suche Whg., 4Zi. 90qm, 600W Referenzen Wall et al Kap 5: qr-Operator und noch etwas: tr/// (2) Verschachtelungen Friedl J. E. F., 2002. Mastering Regular Expressions O’Reilly, Kap.7 S.335ff. Ausweg: Modifikator d $string = " Suche Whg., 4Zi. 90qm, 600W"; $count = ($string =~ tr/0-9//d); # Loeschen der genannten Zeichen # $string: Suche Whg., Zi. qm, W Perl, 13.02.04 Verschachtelungen 11 Perl, 13.02.04 Verschachtelungen 12