====== 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“ |K**a**tze, K**t**ze, …|
=== 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 [[https://flaci.com/regexp|Flaci-Seite]] zu regulären Ausdrücken durch!