Aus LinuxUser 06/2015

Erste Schritte mit Regular Expressions (Seite 2)

Schlangenbeschwörung

Die Programmiersprache Python macht es Ihnen an vielen Stellen sehr leicht. Möchten Sie alle Varianten von Meier aus einer Namensliste herausfischen, dann kodieren Sie das wie in Listing 3 gezeigt. In Zeile 6 wird jeder Eintrag der Namensliste mit den möglichen Varianten verglichen und als Ergebnis lediglich Meier ausgegeben. Zu mayer gibt es keine exakte Entsprechung in der Variantenliste, weswegen Python diesen Eintrag nicht findet.

Listing 3

# -*- coding: utf-8 -*-
namensliste = ["Meier", "Müller", "Schulze", "mayer"]
variantenliste = ["Meier", "Meyer", "Maier", "Mayer"]
for eintrag in namensliste:
  if eintrag in variantenliste:
    print(eintrag)

Komfortabler funktioniert das Ganze mithilfe von Funktionen für reguläre Ausdrücke [2]. Diese stellt Python über das Modul re bereit [3] – das Kürzel steht für „regular expressions“. Dieses Modul wird in Listing 4 in der dritten Zeile deklariert, ab diesem Punkt lassen sich die Funktionen aus re im Skript nutzen. In Zeile 5 bereitet die Funktion re.compile() das Muster zunächst vor. Dabei steht im Muster [ae] für eines der Zeichen a und e, sinngemäß dasselbe gilt für [iy]. Das Caret (^) benennt den Wortanfang, das Dollarzeichen ($) das Wortende.

Listing 4

# -*- coding: utf-8 -*-
import re
namensliste = ["Meier", "Müller", "Schulze", "mayer"]
muster = re.compile('^m[ae][iy]er$', re.IGNORECASE)
for eintrag in namensliste:
  if muster.match(eintrag):
    print(eintrag)

Beim zweiten Parameter des Funktionsaufrufs handelt es sich um re.IGNORECASE, eine vordefinierte Konstante aus dem re-Modul. Sie bewirkt, dass beim Vergleich des Musters die Groß- und Kleinschreibung keine Rolle spielt. Die Funktion re.match() nimmt den Vergleich des Musters mit der Zeichenkette vor. Auf die Namensliste angewendet, erhalten Sie bei der Ausgabe in Zeile 8 sowohl Meier als auch mayer. Diese Variante deckt also alle vier möglichen Schreibweisen ab, ohne sie dazu wie in Listing 3 explizit aufzählen zu müssen.

Regexe in Perl

Ein Sprache wie Perl wäre ohne reguläre Ausdrücke gar nicht vorstellbar [4]. Ein Vergleich geschieht hier mit der Funktion m für den Operator „match“, beispielsweise so:

$zeichenkette =~ m/Muster/;

Sofern das Muster auf die Zeichenkette passt, fällt das Ergebnis des Vergleichs positiv aus. Für eine fünfstellige Postleitzahl mit erlaubter Null am Anfang passt das Muster \d{5}, da diese aus fünf beliebigen Ziffern besteht (Listing 5).

Mit Länderkennung für die Schweiz und vier Ziffern lautet das Muster CH-[1-9]\d{3}, wobei die erste Ziffer nur aus dem Bereich 1 bis 9 kommen darf. Die Mengenangabe {3} fordert exakt drei weitere, beliebige Ziffern – sowohl bei weniger als auch bei mehr Ziffern schlägt der Vergleich fehl. Eine Prüfung auf CH-1000 fiele andererseits syntaktisch gültig aus.

Für eine zusätzliche Ortsangabe der Form A-4020 Linz genügt die Ergänzung des bisherigen Musters um ein Leerzeichen („\s“) und alphanumerische Zeichen. Der einfache Ausdruck für eine Adresse in Österreich lautet damit A-\d{4}\s[A-Z][a-z]+. Die Schreibweise [A-Z][a-z]+ stellt dabei sicher, dass der Ortsname aus mindestens zwei Buchstaben besteht und mit einem Großbuchstaben beginnt.

Listing 5

#!/usr/bin/perl -w
my ($muster, $postcode);
$postcode = '01256';
$muster = '\d{5}';
if($postcode =~ m/$muster/)
  {print "PLZ-Format ist korrekt: $postcode\n"}

Matches im Netz

Webdesigner und Grafikspezialisten arbeiten viel mit Farbcodes. Häufig kommt dabei eine hexadezimale Schreibweise zum Einsatz, beispielsweise #ff0000 für Rot in der RGB-Notation. Um diese Angabe automatisiert auf grammatikalische Korrektheit zu prüfen, genügt als Muster der reguläre Ausdruck #[a-f\d]{6}. Auf ein Hash-Zeichen folgen sechs Buchstaben aus dem Bereich a bis f oder die Ziffern 0 bis 9 – alle anderen Zeichen repräsentieren keinen richtigen Farbcode. In der Auswertung bietet sich diese Zeile an, beispielsweise in einem CGI-Skript in Perl (Listing 6).

Listing 6

$muster = '#[a-f\d]{6}';
$farbcode =~ m/$muster/i;

Das unscheinbare i am Ende entspricht der Option -i bei Grep und sorgt auch hier dafür, dass sowohl Groß- als auch Kleinbuchstaben gelten. Das deckt alle Varianten des Farbcodes ab. Auch bei Formularen auf Webseiten empfiehlt es sich, die Nutzereingabe zu validieren. Für E-Mail-Adressen schlägt Jan Goyvaerts [5] folgendes Muster vor:

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
KAUFEN
LinuxUser 06/2015 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: