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