Inhaltsverzeichnis
Reguläre Sprachen
Reguläre Ausdrücke
Im Stoffgebiet Netzwerke habt ihr IP-Adressen kennengelernt.
Beispiel:
192.168.178.1
Um eine IP-Adresse darzustellen ist die Zeichenmenge
erforderlich, welche man als Alphabet auffassen der formalen Sprache „IP-Adresse“ auffassen kann. „IP-Adressen“ ist dabei eine Teilmenge der Menge , also der Menge aller Worte, die sich mit beschreiben lassen.
1. Möglichkeit: in Worten
Eine IP-Adresse besteht aus vier ein bis dreistelligen Zahlen im Bereich von 0 bis 255, die jeweils durch einen Punkt getrennt sind.
2. Möglichkeit: durch einen regulären Ausdruck
Reguläre Ausdrücke (RegEx) sind eine leistungsfähige Methode, um Texte zu durchsuchen, zu analysieren und bestimmte Muster zu finden. Sie sind in der Informatik eine Möglichkeit, einen Text nach bestimmten Ausdrücken zu durchsuchen.
Kurzreferenz für reguläre Ausdrücke
Grundlagen
| Ausdruck | Bedeutung | Beispiel | Findet |
|---|---|---|---|
a | genau den Buchstaben a | „Banane“ | a |
abc | die Zeichenfolge abc | „xabcx“ | abc |
. | ein beliebiges Zeichen (außer Zeilenumbruch) | „Katze“ | Katze, Ktze, … |
Zeichenklassen
| Ausdruck | Bedeutung | Beispieltext | Treffer |
|---|---|---|---|
\d | eine Ziffer (0–9) | „Haus 42“ | 4, 2 |
\w | ein Wortzeichen (Buchstabe, Zahl, _) | „Test_1“ | T, e, s, t, _, 1 |
\s | ein Leerzeichen | „Hallo Welt“ | (zwischen Hallo und Welt) |
\b | Wortgrenze | „ein Haus“ | vor „ein“, „Haus“ |
Wiederholungen
| Ausdruck | Bedeutung | Beispiel | Findet |
|---|---|---|---|
a* | 0 oder mehr a | „aaah“ | aaa |
a+ | 1 oder mehr a | „baaah“ | aaa |
a? | 0 oder 1 a | „baah“ | a |
a{3} | genau 3 a | „aaaah“ | aaa |
a{2,4} | 2 bis 4 a | „aaaaah“ | aaaa |
Positionen
| Ausdruck | Bedeutung | Beispiel | Findet |
|---|---|---|---|
^abc | steht am Anfang der Zeile | „abcde“ | abc |
xyz$ | steht am Ende der Zeile | „testxyz“ | xyz |
Gruppierung und Alternativen
| Ausdruck | Bedeutung | Beispieltext | Treffer | ||
|---|---|---|---|---|---|
(abc) | Gruppe – fasst Zeichen zu einer Einheit zusammen | abcabc mit (abc) | „abc“ (erste Gruppe) | ||
A | B | Alternative – findet A oder B | Katze Hund Maus mit Katze | Hund | „Katze“, „Hund“ | ||
(ab){2} | Wiederholung einer Gruppe – zweimal „ab“ hintereinander | ababc | „abab“ | ||
(?:abc) | Nicht-speichernde Gruppe – gruppiert ohne Nummerierung | (?:abc){2} auf abcabc | „abcabc“ | ||
(\d+)\s+\1 | Rückverweis – sucht zwei gleiche Zahlen hintereinander | 42 42 | „42 42“ | ||
Pythonprogramme zum Test regulärer Ausdrücke
In den folgenden Pythonprogrammen kannst du die Beispiele aus den Referenztabellen testen.
#Grundlagen #Der reguläre Ausdruck muss in einem sogenannten Raw-String r"" stehen. import re text = "Banane" print(re.findall(r"a", text)) text = "xabca" print(re.findall(r"abc", text)) text = "Katze" print(re.findall(r".", text))
#Zeichenklassen import re text = "Baby" print(re.findall(r"[abc]", text)) text = "Haus" print(re.findall(r"[A-Z]", text)) text = "Test123" print(re.findall(r"[a-zA-Z]", text)) text = "A1B" print(re.findall(r"[^0-9]", text))
#Wiederholungen import re text = "aaah" print(re.findall(r"a*", text)) text = "baaah" print(re.findall(r"a+", text)) text = "baah" print(re.findall(r"a?", text)) text = "aaah" print(re.findall(r"a{3}", text)) text = "aaaaah" print(re.findall(r"a{2,4}", text))
#Positionen import re text = "abcde" print(re.findall(r"^abc", text)) text = "testxyz" print(re.findall(r"xyz$", text))
#Wiederholungen import re text = "abcabc" print(re.findall(r"(abc)", text)) text = "Katze Hund Maus" print(re.findall(r"Katze|Hund", text)) text = "ababc" print(re.findall(r"(ab){2}", text)) text = "abcabc" print(re.findall(r"(?:abc){2}", text)) text = "42 42" print(re.findall(r"(\d+)\s+\1", text))
Aufgabe 1
Entwirf einen regulären Ausdruck, der drei ein- bis dreistellige Zahlen durch einen Punkt trennt! Wende den Ausdruck im nachfolgenden Programmauf den Text an!
# Aufgabe 1 import re text = """ 192.168.178.1 0.0.0.0 270.98.8.99 192_168_4236_7 3.3.3,3 127.0.0.0 177.0.0 1921681781 """ print(re.findall(r"", text))
Aufgabe 2
Verbessere deinen Ausdruck von Aufgabe 1 so, dass der IP-Adressen erkennt!
# Aufgabe 2 import re text = """ 192.168.178.1 0.0.0.0 270.98.8.99 192_168_4236_7 3.3.3,3 127.0.0.0 177.0.0 1921681781 """ print(re.findall(r"", text))
Aufgabe 3
Finde reguläre Ausdrücke für
- eine deutsche Postleitzahl
- eine einfache E-Mail-Adresse
- Wörter mit Großbuchstaben am Anfang
Reguläre Sprachen
Eine reguläre Sprache ist eine Menge von Wörtern über ein Alphabet $A$, die man durch einfache, sich wiederholende Muster (Reguläre Ausdrücke) beschreiben kann.
Reguläre Sprachen haben in der Informatik eine besondere Bedeutung, z.B. beim Compilerbau. In Klasse 12 werden wir den Begriff fachlich exakt definieren.
Aufgabe 4
Arbeite die Flaci-Seite zu regulären Ausdrücken durch!
