Benutzer:Andreas Plank/Reguläre Ausdrücke

Aus Offene Naturführer
< Benutzer:Andreas Plank
Version vom 22. Oktober 2020, 18:18 Uhr von Andreas Plank (Diskussion | Beiträge) (Suchen mit Randbedingungen (Behauptungen, engl: Assertions): +Text)

(Diff.) ← Nächstältere Version | Aktuelle Version (Diff.) | Nächstjüngere Version → (Diff.)
Wechseln zu: Navigation, Suche

Seiten zum austesten

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:

  1. 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
  2. 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 Suche 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)
     ↓      ↑
Symbol support vote.svg  voraus bedingt  
Suche
(?!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)
     ↓      ↑
Symbol oppose vote.svg  voraus bedingt  
Suche
(?<=Ausdruck) Bedingung positiv rückschauend
positive look-behind assertion
┌→ optional regulär
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
      ↑      ↓
Symbol support vote.svg (zu)rück bedingt
Suche
(?<!Ausdruck) Bedingung negativ rückschauend
negative look-behind assertion
┌→ optional regulär
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
      ↑      ↓
Symbol oppose vote.svg (zu)rück bedingt
Suche

 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 &amp; 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. &amp; " \
         "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 &amp;.".format(tmp_line.strip())
    textline = regex_amp_complex.sub("&amp;", tmp_line)  # overwrite line content



Anmerkungen
  1. 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 …)
Quelle: Offene Naturführer, Das Wiki zu Bestimmungsfragen: Benutzer:Andreas Plank/Reguläre Ausdrücke (Zuletzt geändert:
Dieses Attribut ist ein Spezialattribut in diesem Wiki.
22 Oktober 2020 17:18:29). Abgerufen am 23. Dezember 2024, 07:14 von https://offene-naturfuehrer.de/web/Benutzer:Andreas_Plank/Reguläre_Ausdrücke