Skip to content

Commit

Permalink
Add notes on HackyHour No. 22
Browse files Browse the repository at this point in the history
  • Loading branch information
ckubgi committed Sep 25, 2024
1 parent 586a7ca commit 2cb17d0
Showing 1 changed file with 150 additions and 0 deletions.
150 changes: 150 additions & 0 deletions notes/2024-07-24-HackyHour-22.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
# Reguläre Ausdrücke

- Vortrag: Andre Pietsch

## Was ist das? Definition
- Metasprache zur Musterabfrage in Texten
- Regular Expressions abgekürzt als regex oder regexp
- Folge von Zeichen, die ein Übereinstimmungsmuster in Zeichenketten angeben. Z.B. bestimmte Zeichen oder Wörter.
- Muster werden von Algorithmen zum Suchen und Ersetzen von Zeichenketten oder zur Validierung von Eingaben verwendet.

XKCD Comic: <http://xkcd.com/208/>

## Was braucht man zum "matchen" von Text
- Auswahl der zu übereinstimmenden **Zeichen**.
- Festlegung von **Start- und Endpunkten** für den Abgleich.
- Bestimmen der **Anzahl** der Übereinstimmungen.
- Bestimmen der abzugleichenden **Gruppen**.
- **Unabhängigkeit** von einem Betriebssystem

## Die Grammtik von RegEx: Spezielle Zeichen

- `\n` Entspricht einem Zeilenumbruch/Zeilenvorschub.
- `\r` Entspricht einem Zeilenrücklauf.
- `\t` Entspricht einem horizontalen Tabulator.
- `\v` Entspricht einem vertikalen Tabulator.
- `\f` Entspricht einem neuen Seiten-/Formularvorschub.
- `\` Umgehung des folgenden Zeichens

## Die Grammtik von RegEx: Zeichenklassen

- `.` Passt auf **jedes Zeichen** außer Zeilenumbruch.
- `\s` Passt auf alle **Leerzeichen**. [“ “, \t, \r, \n, \v und \f]
- `\S` Passt auf alle Zeichen **Nicht-Leerzeichen**. [alle Zeichen außer „ “, \t, \r, \n, \v und \f]
- `\d` Passt auf alle **Ziffern**. [0-9]
- `\D` Passt auf alle **Nicht-Ziffern**. [alle Zeichen außer 0-9]
- `\w` Stimmt mit allen **Wortzeichen** überein. [A-Z, a-z, 0-9 und _]
- `\W` Trifft auf alle **Nicht-Wort-Zeichen** zu. [alle Zeichen außer A-Z, a-z, 0-9 und _]

## Die Grammtik von RegEx: Quantifizierer

- `?` Entspricht 0 oder 1 Vorkommen des vorangehenden Elements. [`colou?r` entspricht sowohl `color` als auch `colour`]
- `*` Passt auf 0 oder mehr Vorkommen des vorangehenden Elements. [`ab*c` entspricht sowohl `ac`, `abc`, `abbc` usw.]
- `*?` Entspricht keinem oder mehreren Vorkommen des vorangehenden Elements, aber **non-greedy**.
- `+` Entspricht einem oder mehreren Vorkommen des vorangehenden Elements. (`ab+c` passt sowohl auf `abc`, `abbc` usw., aber nicht auf `ac`)
- `+?` Entspricht einem oder mehreren Vorkommen des vorangehenden Elements, aber **non-greedy**.
- `{n}` Trifft genau `n`-mal auf das vorhergehende Element zu.
- `{min,}` Entspricht dem vorangehenden Element mindestens bis zur Zahl von `min` oder mehr.
- `{,max}` Entspricht dem vorangehenden Element bis zur Zahl von `max`.
- `{min,max}` Entspricht dem vorangehenden Element mindestens `min`-mal, aber höchstens `max`-mal

** Greedy Matching /Gieriger Abgleich
Die Wiederholungszeichen `*` und `+` führen dazu dass die größtmögliche Zeichenkette gesucht wird. Daher bezeichnet diese Zeichen als "gierig"/"greedy".

Beispiel:
`F.+,` matches “From here, to there,” in `From here, to there, to everywhere`

`F.+?,` matches “From here,” in `From here, to there, to everywhere`


## Die Grammtik von RegEx: Bereiche
- `[abc]` Passt auf ein **einzelnes Zeichen**, das sich innerhalb der Klammern befindet. (in diesem Beispiel `a` oder `b` oder `c`)
- `[^abc]` Passt auf ein **einzelnes Zeichen**, das nicht in den Klammern enthalten ist. [in diesem Beispiel alles außer `a` oder `b` oder `c`]
- `[A-Z]` Passt auf ein **einzelnes Zeichen** im Bereich von A bis Z. [`A` oder `B` oder ... oder `Z`]
- `[a-z]` Passt auf ein **einzelnes Zeichen** im Bereich von a bis z. [`a` oder `b` oder ... oder `z`]
- `[0-9]` Passt auf ein **einzelnes Zeichen** im Bereich von 0 bis 9. [`0` oder `1` oder ... oder `9`]
- `[A-Za-z0-9]` Passt auf ein einzelnes Zeichen im Bereich von **A bis Z, a bis z oder 0 bis 9**. [`A` oder `B` oder ... oder `a` oder `b` oder ... oder `0` oder `1` oder ... oder `9`]

## Die Grammtik von RegEx: Anker

- `^` Matched den Anfang einer Zeichenkette und auf jede neue Zeile.
- `$` Matched auf das Ende einer Zeichenkette und auf jede neue Zeile.
- `\b` Stimmt mit einer Wortgrenze überein. [`\bcat\b` passt zu `cat` als einzelnes Wort, aber nicht in `concatination`]
- `\B` Passt auf eine Nicht-Wort-Grenze. [`\Bcat\B` passt auf „cat“ in `concatination`, aber nicht als einzelnes Wort `cat`]
- `\G` Entspricht dem Startpunkt einer Suche und der Position, an der die vorherige erfolgreiche Suche endete. Nützlich für Iterationen.

## Die Grammtik von RegEx: Gruppen

- `(a|b)` Entspricht a **oder** b. (Boolesches ODER).
- `(…)` Gibt eine erfassende Gruppe/einen erfassenden Ausdruck an (ersetzen Sie „...“ durch einen regulären Ausdruck).
- `(?:…)` Bezeichnet eine passive, nicht erfassende Gruppe/einen nicht erfassenden Ausdruck (ersetzen Sie „...“ durch einen regulären Ausdruck).
- `$n | \n` **Rückverweis** auf die **n**-te erfassende Gruppe.
- `$2 | \2` **Rückverweis** auf die **2**. erfassende Gruppe. [„xyz“ in `^(abc)(xyz)$`]
- `$1 | \1` **Rückverweis** auf die **1**. Erfassungsgruppe. [„xyz“ in `^(?:abc)(xyz)$`]


## Die Grammtik von RegEx: Assertions

- `?=` **Positive Lookahead** [`\d(?=abc)` findet eine Ziffer, die direkt von „abc“ gefolgt wird, z. B. `1` in „1abc2abc“]
- `?!` **Negative Lookahead** [`\d(?!abc)` findet eine Ziffer, die nicht direkt von „abc“ gefolgt wird, z. B. `2` in „1abc2def“]
- `?<=` **Positive Lookbehinds** [`(?<=abc)\d` findet eine Ziffer, der ein „abc“ direkt vorausgeht, z. B. 1 in „abc1abc2“]
- `?<!` **Negative Lookbehinds** [`(?<!abc)\d` findet eine Ziffer, die nicht direkt vor „abc“ steht, z. B. 2 in „abc1def2“]


## Die Grammtik von RegEx: POSIX Klassen

- `[:upper:]` Entspricht allen **Großbuchstaben** (entspricht `[A-Z]`).
- `[:lower:]` Entspricht allen **Kleinbuchstaben** (entspricht `[a-z]`).
- `[:alpha:]` Entspricht allen **Buchstaben** (entspricht `[A-Za-z]`).
- `[:digit:]` Entspricht allen **Ziffern** (entspricht `[0-9]`).
- `[:alnum:]` Entspricht allen **Buchstaben** und **Ziffern** (entspricht `[A-Za-z0-9]`).
- `[:punct:]` Entspricht allen **Interpunktionszeichen**. [zum Beispiel `!`, ``, `#`, `$`, `%`, `&`, `*`, `+`, `-`, usw.]
- `[:blank:]` Passt auf **Leerzeichen** (` `)und Tabulator (`\t`).
- `[:space:]` Passt auf alle **nicht sichtbaren Zeichen**. [`\t`, `\r`, `\n`, `\v` und `\f`]
- `[:word:]` Passt auf alle **Wortzeichen** (entspricht `\w`).

## Übungen

Websites mit guten Übungen.
RegEx Golf - <https://alf.nu/RegexGolf>
RegEx Sketch Engine (Exercises) - <https://regex.sketchengine.eu/basic-exercises.html>
RegEx Tutorials (Exercises) - <http://regextutorials.com/excercise.html>

## Wo kann ich reguläre Ausdrücke bei der täglichen Arbeit verwenden?

- MS Word
- Suchen und Ersetzen als abgespeckte Version von regulären Ausdrücken mit einer Menge seltsamer oder anderer Syntax als der gerade vorgestellten Syntax.
- MS Excel
- Funktionen: REGEXTEST, REGEXEXTRACT und REGEXREPLACE, aber nur mit Microsoft 365 und als Beta-Funktionen
- Browser-Suche (über Addons) z.B Brave
- Batch-Umbenennungs-Tools z.B Advanced Renamer
- Apps für Notizen z.B Obsidian

## Wie benutzt man reguläre Ausdrücke mit Python?

**Python-Pandas**
Ein Beispiel: Erstellen einer Reihe neuer Spalten aus einer gegebenen Spalte unter Verwendung regulärer Ausdrücke mit

`df['column'].str.extract('regular_expression')`

**Python re**
Modul für die Arbeit mit regulären Ausdrücken in Python, das Ihnen einen variablen Satz von Funktionen für die Arbeit mit Text in Python bietet. Es verwendet die vorgestellte Syntax.

## Das Python re-Modul

`importieren re`
Importiert das re-Modul.

`re.search()`
Prüft, ob eine Zeichenkette mit einem regulären Ausdruck übereinstimmt, ähnlich wie die Methode `find()` für Zeichenketten. Sie gibt True oder False zurück.

`re.findall()`
Extrahiert Teile einer Zeichenkette, die mit einem regulären Ausdruck übereinstimmen. Gibt eine Liste von Strings oder Tupeln zurück.

## Nützliche Links

RegEx Cheatsheet on Cheatography.com: <https://cheatography.com/davechild/cheat-sheets/regular-expressions/>
RegEx Golf <https://alf.nu/RegexGolf>
RegEx Sketch Engine <https://regex.sketchengine.eu/index.html>
RegEx Tutorials <http://regextutorials.com/>
regex101 <https://regex101.com/>

0 comments on commit 2cb17d0

Please sign in to comment.