Reguläre Ausdrücke (Regex)
Regex sind Suchmuster für Text. Ein Zeichen steht für sich selbst, außer Sonderzeichen (*+?{}[]\|()
), die mit einem Backslash \
"escaped" werden müssen. Wichtige Platzhalter sind .
für ein beliebiges Zeichen, \d
für eine Ziffer, \w
für ein alphanumerisches Zeichen und \s
für Leerraum (Whitespace); die jeweiligen Großbuchstaben wie \D
negieren die Auswahl. Eine Zeichenauswahl erfolgt mit [...]
, auch als Bereich [a-z]
oder als Negation [^a-z]
. Wiederholungen steuern *
(0 oder mehr), +
(1 oder mehr), ?
(optional) und {n,m}
(genaue Anzahl); ein angehängtes ?
(z.B. *?
) macht die Suche "non-greedy". Runde Klammern ()
fassen Ausdrücke zu Gruppen zusammen, |
trennt Alternativen. Die Position wird mit ^
(Anfang) und $
(Ende) einer Zeile oder \b
(Wortgrenze) verankert.
Detaillierte Regex-Beispiele
Syntax |
Beschreibung |
Beispiel |
Platzhalter |
|
|
. |
Jedes beliebige Zeichen (außer Zeilenwechsel) |
a.c |
\d |
Dezimalziffer ([0-9] ) |
\d{3} |
\D |
Jedes Zeichen außer einer Ziffer |
\D+ |
\w |
Jedes alphanumerische Zeichen ([A-Za-z0-9_] ) |
\w+ |
\W |
Jedes nicht-alphanumerische Zeichen |
\W |
\s |
Jede Art von Leerzeichen (Whitespace) |
hello\sworld |
\S |
Jedes Zeichen außer Whitespace |
\S+ |
Zeichenauswahl |
|
|
[abc] |
Genau eines der Zeichen a, b oder c |
gr[ae]y |
[^abc] |
Jedes Zeichen außer a, b oder c |
[^0-9] |
[a-z] |
Ein Zeichen im Bereich von a bis z |
[A-Z] |
Wiederholungen |
|
|
* |
0 oder mehr Wiederholungen |
\d* |
+ |
1 oder mehr Wiederholungen |
\w+ |
? |
0 oder 1 Wiederholung (optional) |
colou?r |
{n} |
Genau n Wiederholungen |
\d{4} |
{n,} |
Mindestens n Wiederholungen |
\d{2,} |
{n,m} |
Zwischen n und m Wiederholungen |
\d{2,4} |
Gruppen & Alternativen |
|
|
(...) |
Gruppiert Ausdrücke und fängt das Ergebnis |
(https?://) |
(?P<N>...) |
Benannte Gruppe |
(?P<year>\d{4}) |
| |
Logisches ODER |
GET|POST |
\1 , \2 |
Rückverweis auf Gruppe 1, 2 etc. |
(\w+)\s\1 |
Position (Anchors) |
|
|
^ |
Anfang der Zeile |
^From: |
$ |
Ende der Zeile |
11$ |
\A |
Anfang der gesamten Zeichenkette |
\A-----BEGIN |
\Z |
Ende der gesamten Zeichenkette |
\n\Z |
\b |
Wortgrenze |
\bWort\b |
\B |
Keine Wortgrenze |
\B-\B |
XPath & JSONPath
XPath navigiert durch XML-Dokumente mit /
(direktes Kind), //
(beliebiger Nachfahre), .
(aktueller Knoten) und ..
(Elternknoten). Filter (Prädikate) in eckigen Klammern []
wählen nach Position [1]
, Attribut [@type="x"]
oder Inhalt [tag="wert"]
aus. Werte liest man mit @attribut
oder der Funktion text()
aus. JSONPath fragt JSON-Daten ab, beginnend beim Wurzelelement $
. Auf Kindelemente wird mit .
oder ['name']
zugegriffen. ..
sucht auf allen Ebenen (rekursiv) und [*]
wählt alle Array-Elemente. Mit [?(@...)]
werden Filter angewendet, wobei @
das aktuelle Element ist.
Detaillierte XPath-Beispiele
Syntax |
Beschreibung |
Beispiel |
tag |
Wählt alle Knoten mit diesem Tagnamen |
lecturer |
* |
Wählt alle Kindknoten aus |
lecturer/* |
//tag |
Wählt passende Nachfahrenknoten auf allen Tiefen |
//name |
. / .. |
Aktueller Knoten / Elternknoten |
//name/.. |
[n] |
Wählt den n-ten Knoten (Zählung startet bei 1) |
lecturer[1] |
[@attrib] |
Wählt Knoten, wo das Attribut gesetzt ist |
lecturer[@type] |
[@a="v"] |
Wählt Knoten, wo Attribut a den Wert v hat |
lecturer[@type="external"] |
[tag] |
Wählt Knoten, die einen Kindknoten tag haben |
lecturer[name] |
[t="v"] |
Wählt Knoten mit Kindknoten t mit Inhalt v |
lecturer[email="a@b.ch"] |
@attrib |
Gibt den Wert des Attributs aus |
./lecturer/@type |
text() |
Gibt den Text des Knotens aus |
./lecturer/name/text() |
count() |
Gibt die Anzahl der Knoten aus |
count(./lecturer) |
sum() |
Bildet die Summe der Knoten (müssen Zahlen sein) |
sum(./lecturer/units) |
Detaillierte JSONPath-Beispiele
Syntax |
Beschreibung |
Beispiel |
$ |
Das Wurzelobjekt |
$ |
.prop |
Kindobjekt mit dem Namen prop |
$.movies |
['prop'] |
Alternative zum Punkt |
$['movies'] |
..prop |
Nachfahren auf allen Ebenen (rekursiv) |
$..year |
[n] |
n-tes Objekt in einem Array (Zählung startet bei 0) |
$.movies[0] |
[*] |
Alle Einträge eines Objekts oder Arrays |
$.movies[*] |
[n:m] |
Bereich eines Arrays (Slice) |
$.movies[3:5] |
[?(filter)] |
Filtert Elemente basierend auf einem Ausdruck |
$.movies[?(@.year > 1995)] |
@ |
Das aktuelle Element in einem Filter |
[?(@.title =~ 'Kill.*')] |
HTTP-APIs & Web Crawling
HTTP-APIs nutzen URLs, die aus Schema, Host, Pfad und optionalen Query-Parametern (?key=val
) bestehen, um Daten via REST-Prinzipien auszutauschen (Methoden: GET, POST, PUT, DELETE). Authentifizierung erfolgt oft über API-Keys. Web Scraping extrahiert Daten aus dem HTML von Webseiten. Die Auswahl der Daten erfolgt mit CSS-Selektoren. Web Crawling folgt Hyperlinks, um weitere Seiten zu verarbeiten. Dabei sollte man die robots.txt
respektieren. Die sitemap.xml
kann helfen, alle Unterseiten zu finden.
Detaillierte CSS-Selektor-Beispiele
Syntax |
Beschreibung |
Beispiel |
* |
Wählt alle Elemente aus |
* |
tag |
Wählt alle Elemente mit diesem Tagnamen |
h1 |
.class |
Wählt Elemente mit dieser Klasse |
.intro |
#id |
Wählt das Element mit dieser ID |
#register |
[attr=val] |
Wählt Elemente, deren Attribut attr den Wert val hat |
[type="text"] |
:first-child |
Wählt das erste Kind seines Elternelements |
p:first-child |
:nth-child(n) |
Wählt das n-te Kind (auch 2n , odd , even ) |
tr:nth-child(odd) |
A B |
Wählt alle B, die Nachfahren von A sind (Descendant) |
div p |
A > B |
Wählt alle B, die direkte Kinder von A sind (Child) |
ul > li |
A + B |
Wählt B, das direkt auf A auf derselben Ebene folgt |
h1 + p |
A ~ B |
Wählt alle B, die auf A auf derselben Ebene folgen |
h1 ~ p |
Komplexe Anwendungsbeispiele
Regex-Vorlage
^(?P<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s\[(?P<level>INFO|WARN|ERROR)\]\s\(user:\s'(?P<user>[\w\.-]+@[\w\.-]+)'\)\s"(?P<message>.*?)"$
XPath-Vorlage
//course[@id='cds104']/lecturer[@type='external' and units > 5]/name/text()
JSONPath-Vorlage
$.movies[?(@.year > 1999 && @.title =~ /^Matrix.*/)].actors[*].name
CSS-Selector-Vorlage (für Web Scraping)
main#content article.published:not(.featured) h2 + div.meta a[href*="author"]
GRAPHQL
{
table1 {
property1
property2
othertable {
prop_from_other_table
}
}
}