You're not registered yet. Click here to register. Credits 
You can register here for free.
This topic has 0 replies
and has been read 471 times
 L 4
Gero Offline




Posts: 2.650

Sun Nov 21, 2010 11:03 pm
Lektion 4 Quote · reply

Lektion 4: Die Funktion regulärer Ausdruck - erste Gehversuche

In der Informatik ist ein regulärer Ausdruck (engl. regular expression, Abk. RegExp oder Regex) eine Zeichenkette, die der Beschreibung von Mengen beziehungsweise Untermengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. Reguläre Ausdrücke finden vor allem in der Softwareentwicklung Verwendung; für fast alle Programmiersprachen existieren Implementierungen.

Reguläre Ausdrücke stellen erstens eine Art Filterkriterium für Texte dar, indem der jeweilige reguläre Ausdruck in Form eines Musters mit dem Text abgeglichen wird. So ist es beispielsweise möglich, alle Wörter, die mit S beginnen und auf D enden, zu „matchen“ (von englisch „to match“ – „auf etwas passen“, „übereinstimmen“, „eine Übereinstimmung finden“), ohne die zwischenliegenden Buchstaben explizit vorgeben zu müssen. Ein weiteres Beispiel für den Einsatz als Filter ist die Möglichkeit, komplizierte Textersetzungen durchzuführen, indem man die zu suchenden Zeichenketten durch reguläre Ausdrücke beschreibt.

Zweitens lassen sich aus regulären Ausdrücken, als eine Art Schablone, auch Mengen von Wörtern erzeugen, ohne jedes Wort einzeln angeben zu müssen. So lässt sich beispielsweise ein Ausdruck angeben, der alle denkbaren Zeichenkombinationen (Wörter) erzeugt, die mit S beginnen und mit D enden.

Um dies zu bewerkstelligen ist es notwendig, sich näher mit den Symbolen zu befassen, die unter RegEx zum Einsatz kommen und wie sie miteinander zu kombinieren sind, sprich die für sie geltenden syntaktischen Regeln.

Um dies euch möglichst einfach zu machen, wurde es als sinnvoll erachtet, bei der Wortsuche in dem Abfragefeld Muster nur Großbuchstaben als Eingabe zuzulassen, da man bei der Formulierung von Abfragen mitunter höllisch aufpassen muss. Der Ausschluss der Kleinbuchstaben dient zur Minimierung möglicher Fehlerquellen. Unter RegEx haben zwar auch kleingeschriebene Buchstaben bestimmte Bedeutungen, die für unsere Zwecke hier aber (vorerst) nicht weiter interessieren. Programmtechnisch wäre es keine Schwierigkeit, dies zu ändern. Derzeit besteht aber kein Bedarf dafür.

Ziel dieser und der folgenden Lektionen ist es, uns schrittweise an die Abfrage nach allen drei-und vierbuchstabigen Wörtern mit mindestens einem C heranzuwagen, die aber ohne ein H oder K auskommen. Diese Frage zieht sich wie ein roter Faden hindurch.

Genug palavert. Es gilt der Grundsatz: Learning by doing!

Das Symbol „.“
Anmerkung: Suchstrings bzw. Symbole werden im Rahmen dieses Tutorials durch Anführungszeichen „“ markiert, die „“ selbst sind kein Teil der Suchfolge bzw. des Symbols

Dein Scrabblefreund hat die Partie mit der Scrabblenotdurft TÖS eröffnet. Boshafterweise hat er gleich den Plural gelegt, um dir das Legen eines neuen Wortes unter gleichzeitiger Erweiterung von TÖ zu TÖS zu vermiesen. Was kann man mit TÖS anfangen?

Klar, mit der Abfrage Wildcards *TÖS* ist es für uns ein Klacks festzustellen, wie viele Wörter es gibt, die ein TÖS enthalten. Allerdings stellten wir seinerzeit in der Lektion 3 einen Bug fest, da diese Art der Abfrage mit Umlauten nicht funktioniert. (ab der Version 3.1.0 Patch 22c ist dieser Bug übrigens gefixt). Man kann aber diese Abfrage auch mit der Funktion regulärer Ausdruck durchführen - gebt dazu nur „TÖS“ (wichtig: kein * oder ? eingeben!) als Suchmuster an:



Auf Basis der aktuellen Downloadversion ergeben sich 224 Treffer. Wir ändern die Sortierreihenfolge und scrollen nach unten zu den kürzesten Wörtern:



Hier sehen wir die Wörter mit der höchsten Wahrscheinlichkeit, die für eine Erweiterung von TÖS in Betracht kommen. Warum durften wir bei der Abfrage keinen * oder ? verwenden? Diesen Zeichen sind unter RegEx bestimmte Bedeutungen zugewiesen, die sich anders darstellen als unter der Suche per Wildcard. Mehr dazu später.

Der Hauptgrund ist aber, dass RegEx hier nach Übereinstimmungen der Zeichenfolge „TÖS“ mit den Wörtern des Dictionarys sucht. Dabei ist es ohne Belang, ob TÖS am Anfang, irgendwo in der Mitte oder am Ende eines Wortes steht. Bei der Suche „TÖS*“ unter der Funktion Wildcards werden nur Wörter gematcht, die mit TÖS anfangen, mit "*TÖS" Wörter, die mit TÖS enden.

Jetzt lernen wir das erste Symbol unter RegEx kennen, nämlich den Punkt: .

Der Punkt steht für jedes mögliche einzelne Zeichen. Die Bedeutung eines Zeichens muss sich keineswegs nur auf Buchstaben erstrecken, für unsere Zwecke hier reicht es aber, wenn wir uns auf die von Buchstaben beschränken. Sehr vereinfacht entspricht der . in etwa dem ? in der Funktion Wildcard.

Wir wiederholen die Abfrage, diesmal aber mit „TÖS.“ (also mit einem Punkt).
Die Abfrage matcht 215 Treffer, also neun weniger als mit „TÖS“ (ohne Punkt). Warum?
Wir sortieren das Abfrageergebnis und scrollen nach unten zu den kurzen Wörtern:



Es fehlt sofort auf, dass TÖS fehlt. TÖS entspricht nicht dem Suchmuster „TÖS.“, weil „.“ für ein einzelnes Zeichen bzw. Buchstaben steht und TÖS nicht diesem Suchmuster entspricht. Es fehlt ein Zeichen nach dem S.

Hier die ersten Hausaufgaben:

1. Neben „TÖS“ fehlen noch 8 weitere Wörter. Um welche handelt es sich?
(kleine Hilfe: ihr müsst hier die Wörter nicht einzeln durchzählen, diese Aufgabe geht ganz leicht zu lösen über die Funktion Wildcards)
2. Wieviel Treffer matcht der Suchstring „CIS“? (wie viele Wörter gibt es, die ein CIS enthalten?) Spielt es für die Trefferanzahl eine Rolle, welche Kategorien für die Suchanfrage aktiviert werden? Fällt überhaupt ein Unterschied auf?


Ein Wort zur Vorsicht bei Abfragen mit dem Punkt: wenn ihr „..“ als Suchstring eingibt, werdet ihr sehr lange auf die Antwort warten. Die Treffer bei dieser Anfrage entsprechen der Anzahl der Wörter im Wörterbuch, weil jedes Wort im Dic aus mindestens zwei Buchstaben besteht.

Das Symbole Stern „*“ und Fragezeichen „?“

Der Stern „*“ findet entweder kein, ein oder mehrere aufeinanderfolgende Vorkommen des vorangegangenen Zeichens, bzw. Zeichengruppe oder Teilmusters

Das Fragezeichen „?“ findet entweder kein oder genau ein Vorkommen des vorangegangenen Zeichens, bzw. Zeichengruppe oder Teilmusters


Das klingt kompliziert. Um den Unterschied herauszufinden, wiederholen wir die Aufgabe mit „TÖS.“, ersetzen aber den Punkt durch das Fragezeichen: „TÖS?“

Der Unterschied ist frappant: die Abfrage „TÖS.“ matchte wie bereits ausprobiert 215 Treffer, die Abfrage „TÖS?“ hingegen matcht 2143 Treffer!

Die Abfrage „TÖS.“ durchsucht alle Wörter nach dem Suchmuster TÖS plus einem sich anschließenden Buchstaben, die Abfrage „TÖS?“ sucht nach allen Wörtern, die entweder das Suchmuster „TÖ“ ODER das Suchmuster „TÖS“ enthalten (nicht: nur mit dem Suchmuster TÖ / TÖS enden!). Das dem S nachgestellte Fragezeichen macht das S von TÖS bei der Suche optional. Deswegen finden sich hier unter den Treffern Wörter wie NT, ABSTÖSSE, ABNT, FREISTÖSSEN, RN, ADOPTIVCHTER, DURCHSBERTES und ELEFANTÖSES nebeneinander.

Die Abfrage „TÖS*“ übrigens matcht genauso viele Treffer wie die Abfrage „TÖS?“. Im Rahmen unserer Abfrage spielt es keine Rolle, was für einen Symbol wir hier dem S nachstellen. Das Wort STÖSSE als auch das Fantasiewort STÖSSSE wird durch beide Abfragevarianten erfasst. Der Unterschied zwischen den beiden Zeichen kommt erst in komplizierteren Abfragen zur Geltung und braucht uns hier vorerst nicht weiter zu interessieren.

Zitat
Wichtig ist zu wissen, dass die Zeichen ? und * anders als bei der Abfrage Wildcard kein eigenes Zeichen darstellen, sondern stets in Bezug zum direkt voranstehenden Zeichen stehen.



Per Voreinstellung sind * und ? "gierig", weil sie für den Treffer eines Suchmusters alle Zeichen bis zum letztmöglichen verwenden.

Wir beenden diese Lektion mit der Einführung des (Dollar-)Zeichens „$und stellen folgende Hausaufgabe:

3. Wir geben als Suchstring „TÖS$" ein. Wir erzielen 9 Treffer. Was fällt euch auf? Was für einen Einfluss hat das Zeichen „$“ auf unsere Suche?
4. Wir geben als Suchstring „TÖS?$" ein. Wir erzielen 10 Treffer. Warum der Unterschied?


Mit dieser Frage beenden wir unsere Lektion. (dieser Satz war bereits ein kleiner Hinweis)

Gero


Download: Geros Superdic, was sonst! | Discussion: Forum | News: Twitter | ... und im übrigen bin ich der Meinung, dass Wordfinder beim online-Spiel pfui sind!


 Jump  
disconnected Scrabble3D Chat Members online 1
Xobor Einfach ein eigenes Forum erstellen