Benutzer:Andreas Plank/Reguläre Ausdrücke
Seiten zum austesten
- https://regex101.com/ (Regex-Ausdrücke werden direkt vom eingegebenen Suchmuster her erläutert)
- http://regex.larsolavtorvik.com/ oder
- http://gskinner.com/RegExr/.
Inhaltsverzeichnis
PHP
Code in @…@ oder /…/
|
Modus | Wozu/Erklärung |
---|---|---|
{{(?:(?:(?!{{|}}).)++|(?R))*}}
|
rekursiv ausgewogenes {{…}} einzeilig[Anmerkung 1] | |
(?s){{(?:(?:(?!{{|}}).)++|(?R))*}}
|
rekursiv ausgewogenes {{…}} mehrzeilig | |
{{[\w\d]+:([^{}]*+(?:{{(?1)}}[^{}]*)*+)}}
|
rekursiv ausgewogenes {{…}} aber beginnend mit [\w\d]+: (Wiki magische Funktion)
|
Suchen mit Randbedingungen (Behauptungen, engl: Assertions)
Behauptungen (engl: Assertions) sind Ausdrücke, die eine Zusatzbedingung für einen regulären Ausdruck darstellen, d. h. der Suchkontext, der definiert wurde, muß erfüllt sein, ohne daß der Suchkontext selbst im nachher gefundenen Text erscheint. Suchen mit „Randbedingungen“ könnte man sie vielleicht auch nennen. Nun gibt es hier 2 verschiedene Möglichkeiten diese Randbedingungen anzufügen, wenn man bedenkt, dass ja jeder Suchvorgang immer von links→nach→rechts vorwärtsläuft, dann kann man sagen:
- die eine Möglichkeit soll etwas finden, was der momentanen Suchposition vorausläuft↷, also eine Randbedingung an der Suchposition rechter Seite, dies nennt man vorausschauend (im Englischen “lookahead”)
- je mit 2 Alternativen: vorausschauende Randbedingung stimmt/stimmt nicht
- die andere Möglichkeit soll etwas finden, was zur momentanen Suchposition ↶rückläufig dasteht, also eine Randbedingung an der Suchposition linker Seite, dies nennt man zurückschauend (im Englischen “lookbehind”)
- je mit 2 Alternativen: zurückschauende Randbedingung stimmt/stimmt nicht
Verwirrend mag sein, dass die Bezeichnungen – die sich im Englischen entwickelt haben (look ahead: vorausschauend, look behind: zurückschauend) – aus der von-links-nach-rechts laufenden S → u → c → h → e aus perspektivisch betrachtet werden, sie sich also auf die aktuelle, momentane Suchposition beziehen, von der die Suchmaschine dann vorausschaut (nach rechts vorwärts) oder zurückschaut (nach links rückwärts). Obwohl natürlich die Randbedingungen dann im Such-Code bei der Vorausschau „dahintersteht“ oder bei der Zurückschau „davorsteht“, da dann sich nicht beirren lassen ;-). Zu beachten ist aber generell, dass diese Randbedingungen niemals ins Suchergebnis mit eingeheimst werden (s. auch Beispiele)
Definition | Bezeichnung | Erklärung | Schreibweise |
---|---|---|---|
(?=Ausdruck)
|
Bedingung positiv vorausschauend positive look-ahead assertion |
┌→ optional regulär Ausdruck der Suche (rechts) vorausgehen, oder (?=Ausdruck) behauptet: der momentanen Such-Position unmittelbar (rechts) Vorausstehendes ist Ausdruck
|
Suche(?=Ausdruck) ↓ ↑ voraus bedingt S → u → c → h → e |
(?!Ausdruck)
|
Bedingung negativ vorausschauend negative look-ahead assertion |
┌→ optional regulär Ausdruck darf der Suche nicht vorausgehen, oder (?!Ausdruck) behauptet: der momentanen Such-Position unmittelbar (rechts) Vorausstehendes darf nicht Ausdruck sein
|
Suche(?!Ausdruck) ↓ ↑ voraus bedingt S → u → c → h → e |
(?<=Ausdruck)
|
Bedingung positiv rückschauend positive look-behind assertion |
┌→ Ausdruck muss der Suche vlnr. rückwärtig gesehen dastehen (also links davor), oder (?<=Ausdruck) behauptet: der momentanen Such-Position unmittelbar Vorausstehendes ist Ausdruck
|
(?<=Ausdruck)Suche ↑ ↓ (zu)rück bedingt S → u → c → h → e |
(?<!Ausdruck)
|
Bedingung negativ rückschauend negative look-behind assertion |
┌→ Ausdruck darf der Suche vlnr. rückwärtig gesehen nicht dastehen, oder (?<!Ausdruck) behauptet: der momentanen Such-Position unmittelbar Vorausstehendes ist nicht Ausdruck
|
(?<!Ausdruck)Suche ↑ ↓ (zu)rück bedingt S → u → c → h → e |
Beispiele
Such-Code | Gefundenes | Kommentar |
---|---|---|
sinn(?=los)
|
sinnlos sinnfrei sinnhaft sinnig
|
|
sinn(?!los)
|
sinnlos sinnfrei sinnhaft sinnig |
|
(?<=sinn)los
|
sinnlos sïnnlos gedankenlos sinnig haltlos
|
|
(?<!halt)los
|
sinnlos sturmlos gedankenlos sinnig haltlos |
|
^((?!DNA).)*$
|
Flügel, Tier DNA - Isolierung & Reinigung Gewebeerhaltung - Methoden hier ist die DNA in der Zeile hier ist es am Ende: DNA Tiere |
finde Zeilen, die kein „DNA“ enthalten
Von stackoverflow.com “Regular expression to match a line that doesn't contain a word”: in diesem Beispiel wird also zunächst jede leere Zeichenfolge validiert, um zu sehen, ob kein „DNA“ vor ihr liegt, bevor ein Zeichen durch den
. (Punkt) verkonsumiert wird. Der reguläre Ausdruck (?!DNA). wird das nur einmal tun, weshalb er in eine Gruppe eingeschlossen wird und null oder mehrere Male wiederholt wird, mittels: ((?!DNA).)* . Schlussendlich werden der Zeichen-Such-Start- und Zeichen-Such-End-Punkt verankert, um sicherzustellen, dass die gesamte Such-Eingabe durchgearbeitet wird: ^((?!DNA).)*$ |
\b((?!DNA)\w)*\b
|
Flügel, Tier DNA - Isolierung & Reinigung Gewebeerhaltung - Methoden hier ist die DNA in der Zeile hier ist es am Ende: DNA Tiere DNAtest |
finde alles wortmäßige, außer die Zeichenkette „Wort-mit-DNA“ Dies ist analog zu vorherigem Beispiel, nur dass das Gefundene eine \b Begrenzung (von Worten) haben soll; bei „DNAtest“ ist vorn und hinten die Wort-Begrenzung DNAtest , deshalb entfällt dem Gefundenen
|
Maskierte & vs. &
#!/bin/bash
# find all escaped & in RDF files and list them
sed --silent '/&/{ s@&\(#x\?[0-9]\+;\|[a-zA-Z]\+;\)@\n\&\1\n@gp }' *.rdf | sed --silent '/^&/{p}' | sort --unique
#!/usr/bin/env python
# -*- coding: utf8 -*-
""""
Find all & that are not followed by amp; and other XHTML escaped strings
(either letters or hexadecimal or utf encoded), but ignore the case of searched strings
""""
import re
# get regular expressions
textline = " " \
"<dc:description>" \
"A herbarium specimen of Bupleurum apiculatum Friv. collected by Willing, R. & " \
"Willing, E. & Müller, H." \
"</dc:description> "
tmp_line = textline
regex_amp_complex = re.compile(r"&(?!amp;|[a-z]+;|#x?[0-9]+;)", re.IGNORECASE)
if regex_amp_complex.search(tmp_line):
print "Improperly quoted ampersand in string «{0}» replaced by &.".format(tmp_line.strip())
textline = regex_amp_complex.sub("&", tmp_line) # overwrite line content
- Anmerkungen
- ↑ Das zweite + in
++
ist ein „posessive Quantifier“ (s. http://php.net/manual/de/regexp.reference.repetition.php) laut http://stackoverflow.com/a/1117474/1240387 bewirkt er performantere suche, da nicht alle möglichen Kombinationen ersucht werden (oder so ähnlich …)