Die Herausforderung des Labors für maschinelles Lernen der Universität Triest (Italien) bietet die Lösung von 12 Problemen, und das Niveau der Aufgaben ist sehr unterschiedlich - von superleicht bis schwierig.
Natürlich kann es mehr als eine Lösung geben, und Testfälle im Problem decken nicht alle Optionen ab. Trotzdem, wenn Sie 100% erzielen, dann herzlichen Glückwunsch! Test bestanden.
Spoiler: Bei einigen Aufgaben (besonders bei leichten) ist ein Hinweis praktisch eine Lösung.
Aufgabe 1 - Finde die Zahlen
Es gibt Text mit Zahlen, Sie müssen alle Zahlen finden.
Schwierigkeit: super einfach.
HinweisSie müssen ein Ziffernzeichen und einen Multiplikatorquantifizierer verwenden.
Lösung\ d +
"[0-9] +" ist auch die richtige Entscheidung.
Parsing-Lösung- "\ d" oder "[0-9]" - ein einzelnes Zeichen von 0 bis 9.
- "+" - ein oder mehrere Zeichen sind zulässig.
Aufgabe 2 - Mac-Adressen finden
Es gibt Text, der Mac-Adressen enthält. Sie müssen diese finden.
Schwierigkeit: einfach.
HinweisSie müssen ein Zeichen verwenden, das ein beliebiges Zeichen eines Buchstabens oder einer Zahl, einen zu trennenden Doppelpunkt und einen Multiplikatorquantifizierer bedeutet.
Lösung\ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}
"+" anstelle von "{2}" ist ebenfalls die richtige Entscheidung, wenn auch nicht ganz richtig.
Parsing-Lösung- "\ w" ist ein beliebiges Zeichen im Alphabet oder eine beliebige Zahl.
- "{2}" - Es sind nur 2 Zeichen zulässig.
Beste LösungDiejenigen, die mit der Mac-Adresse vertraut sind, haben festgestellt, dass die Mac-Adresse in hexadezimaler Schreibweise geschrieben ist. In der vorherigen Lösung wurde das Zeichen \ w verwendet, dh ein beliebiges Zeichen des Alphabets und alle Zahlen. Ich stimme zu, wahrscheinlich ist dies unnötig, aber Sie können dies berücksichtigen und gleichzeitig die Regelmäßigkeit verringern.
([\ da-f] {2} :) {5} [\ da-f] {2}
Parsing-Lösung- "\ d" ist eine einzelne Ziffer, "af" ist ein Bereich von a bis f. Insgesamt haben wir einen gültigen Zeichensatz 0123456789abcdef, dh den Hexadezimalcode Hex. "{2}" - 2 beliebige Zeichen aus diesem Zeichensatz.
- "([\ da-f] {2} :)" {5} - Das Wiederholen von zwei Zeichen hex + Doppelpunkt ist genau fünfmal zulässig.
- und am Ende von "[\ da-f] {2}" - 2 beliebige Zeichen aus dem Hex-Set
Aufgabe 3 - FTP-Adressen finden
Es gibt Text mit FTP-Adressen, Sie müssen sie finden.
Schwierigkeit: einfach.
HinweisSie müssen mit ftp: // beginnen und dann die gültigen Zeichen in der Adresse auflisten, ohne den Multiplikatorquantifizierer zu vergessen.
Lösungftp: \ / \ / [\ w \ d -_. \ /] +
Parsing-Lösung- "\ /" - normales Entkommen des Zeichens "/".
- In eckigen Klammern befindet sich eine Aufzählung gültiger Zeichen, dh jedes Zeichen im Alphabet oder eine beliebige Zahl, ein Bindestrich, ein Unterstrich, ein Punkt oder ein Schrägstrich (wenn der Name andere Zeichen enthält, können Sie diese hinzufügen).
Aufgabe 4 - Finden Sie eine Vorlage
Es gibt eine Art formatierte Datei, in der Sie alle Zeilen finden müssen, die dem Muster $ any Zeichen $ entsprechen.
Schwierigkeit: einfach.
HinweisSie müssen das Escapezeichen des reservierten Zeichens, das Zeichen eines beliebigen Zeichens, Multiplizitätsquantifizierer und Lazy verwenden.
LösungEine alltägliche Aufgabe, die jedoch ein wenig besseres Wissen über Stammgäste erfordert.
\\ $. +? \\ $
Parsing-Lösung- "\\ $" ist das Dollar-Screening.
- ". +" - eine beliebige Anzahl von Zeichen, "?" - Gier beseitigen.
Aufgabe 5 - IP-Adressen finden
Finden Sie IP-Adressen aus dem Text.
Schwierigkeit: einfach.
HinweisSehr ähnlich der zweiten Aufgabe.
Lösung\ d + \. \ d + \. \ d + \. \ d +
Wenn Sie anstelle von "+" "{1,3}" geschrieben haben, sind Sie fertig.
Parsing-Lösung- "\ d" ist eine einzelne Ziffer,
- "+" - beliebig viele Zeichen, "{1,3}" - eine strikte Beschränkung der Anzahl der Zeichen (von 1 bis 3).
Beste LösungEine IP-Adresse besteht nicht nur aus Zahlen, sondern auch aus Zahlen von 0 bis 255.
\ b ((\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \.) {3} (\ d | [1 -9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \ b
Parsing-LösungUm den Bereich von 0 bis 255 zu bestimmen, müssen Sie ein wenig versuchen:
- "\ d" ist eine Zahl von 0 bis 9
- "[1-9] \ d" - eine Zahl von 10 bis 99
- "1 \ d {2}" - eine Zahl von 100 bis 199
- "2 [0-4] \ d" - eine Zahl von 200 bis 249
- "25 [0-5]" - Chilso von 250 bis 255
Als nächstes erlauben wir die Wiederholung des Ziffernmusters von 0 bis 255 genau dreimal:
- "(\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]).) {3}" - innerhalb des Punktes, weil es auch 3 mal wiederholt und am Ende den gleichen Zahlenbereich, jedoch ohne Punkt.
- Am Ende und am Anfang fügen wir das Rahmensymbol des Wortes "\ b" hinzu - es wird benötigt, um den Text "1172.30.42.109" aus dem Eintrag zu entfernen (ich stimme zu, es ist unwahrscheinlich und wahrscheinlich unnötig).
Aufgabe 6 - Anker
Ziehen Sie das href-Tag aus dem HTML-Dokument.
Schwierigkeit: mittel.
HinweisVerwenden Sie für jede Klammer "ein beliebiges Zeichen außer" und "oder".
Lösunghref = ("[^"] + "| '[^'] + ')
Parsing-Lösung- "- Starten Sie die Suche mit einem doppelten Anführungszeichen.
- "[^"] + "- außerdem absolut jedes Zeichen außer einem doppelten Anführungszeichen.
- Wir beenden mit einem doppelten Zitat.
Wir setzen dies alles in Klammern, fügen das Zeichen oder - "|" und wiederholen Sie das gleiche für einfache Anführungszeichen.
Aufgabe 7 - Links
In jedem Text finden Sie alle Links. Die Aufgabe wird durch die Tatsache kompliziert, dass es nicht ausreicht, nur den Link zu finden, sondern dass Sie am Ende ungültige Zeichen wegwerfen müssen.
Schwierigkeit: schwierig.
HinweisSie müssen mit http beginnen, "ein beliebiges Zeichen außer" verwenden und die Suche mit einem gültigen Zeichen beenden.
Lösunghttp: \ / \ / ([^> \ s] +) [\ w \ /]
Die Aufgabe enthält keine https-Links. Sie können dies jedoch berücksichtigen, indem Sie "s?" nach http.
Parsing-Lösung- "[^> \ s] +" sucht nach Zeichen außer dem Zeichen ">" und dem Leerzeichen. In der Tat können Sie so lesen: "Wir gehen, bis wir eines dieser Symbole sehen."
- "[\ w \ /]" ist ein Trennzeichen, mit dem ein Link nur mit einem lateinischen Zeichen oder einem Schrägstrich enden kann.
Und als Ergebnis - wir beginnen mit http: //, dann absolut jedem Zeichen außer den Zeichen "<" oder Leerzeichen, aber am Ende ist das lateinische Zeichen oder der Schrägstrich erforderlich.
- extra "s?" in "https?" Erlaube einfach sowohl "http: //" als auch "https: //".
Aufgabe 8 - Überschriften
In HTML ist ein Header ein beliebiges h + -Ziffern-Tag.
Schwierigkeit: mittel.
HinweisBeginnen Sie mit h + Ziffer + einem beliebigen Zeichen oder seiner Abwesenheit.
LösungZiemlich einfach:
<h \ d. *>. * <\ / h \ d. *>
Parsing-Lösung- "h \ d" - hier sagen wir, dass nach dem Zeichen unbedingt "\ d" Ziffer gehen muss.
- Und dann ". *" Kann eine beliebige Anzahl von Zeichen gehen oder nichts kann gehen.
Beste LösungNach h kommt eine Ziffer, und die HTML-Spezifikation besagt, dass Zahlen von 1 bis 6 gültig sind und das Tag selbst nur durch dreieckige Klammern geschlossen werden kann. Daher ist diese Lösung genauer:
<h [1-6] [^>] *>. +? <\ / h [1-6]>
Es stimmt, es liegt ein Fehler vor, mit dem Sie das Tag mit einer Ziffer öffnen und die andere schließen können. Eine noch genauere Lösung wäre daher die Verwendung der Links: "<h ([1-6]) [^>] *>. +? <\ / H \ 1>". Dies bedeutet nicht, dass der Test nicht zwischen Groß- und Kleinschreibung unterscheidet.
Parsing-Lösung- "h [1-6]" - hier sagen wir, dass nach "h" die Zahl von 1 auf 6 gehen muss.
- "[^>] *" - jedes Zeichen außer ">" kann weitergehen oder nicht.
Separat über den Zusatz:
- Wenn wir den Ausdruck "(h [1-6])" in Klammern setzen, erstellen wir eine Gruppe mit der Nummer 1.
- Über den Link zur ersten Gruppe "\ 1" sprechen wir darüber, was wir am Ende desselben sehen wollen, h mit der gleichen Nummer wie am Anfang.
Aufgabe 9 - Telefone
Im freien Text in allen Handys in verschiedenen Formaten gefunden.
Schwierigkeit: schwierig.
HinweisEs ist erforderlich, das Vorzeichen für das Vorhandensein oder Nichtvorhandensein eines Symbols, einen Quantifizierer zur Begrenzung der Anzahl der Ziffern und die Konstruktion eines Zeichensatzes zu verwenden. Mögliches Design oder.
Lösung\ (? \ d {3} [\). \ / -] {1,2} \ d {3} [-.] \ D {4}
Es wird funktionieren, aber es erlaubt zwei Zeichen nach den ersten drei Ziffern - es ist gut, wenn es sich um eine schließende Klammer und ein Leerzeichen danach handelt, aber es ist schlecht, wenn zwei Bindestriche vorhanden sind. Daher gibt es eine etwas genauere Lösung: "\ (? \ D {3} (\)? | [. \ / -]) \ d {3} [-.] \ D {4}"
Parsing-Lösung- "\ (?" - wir geben die Möglichkeit des Vorhandenseins des Symbols an "(" oder dessen Abwesenheit, wir schützen, da es ein reserviertes Symbol ist.
- "\ d {3}" - Ziffern mit einer Einschränkung von nur 3.
- Weitere Zeichen "[\). \ / -] {1,2}" sind möglich - Schrägstrich, schließende Klammer, Punkt, Leerzeichen, Backslash und Bindestrich. {1,2} - sagt, dass diese Zeichen 1 oder 2 sein können. Zum Beispiel die schließende Klammer und das Leerzeichen danach.
- Weiter notwendigerweise "[-.]" - ein Bindestrich oder Punkt.
- Und "\ d {4}" sind die vier Ziffern am Ende.
Aufgabe 10 - Autoren
Es gibt ein bestimmtes Muster, das Elemente enthält. Finden Sie alle Autoren aus dem Autorenfeld.
Schwierigkeit: sehr schwierig.
HinweisMan muss sich darauf verlassen, dass alle Namen von Autoren mit einem Großbuchstaben beginnen und in einem Muster geschrieben sind.
Lösung[AZ] [A-Za-z - '] +, [AZ] (\ {\\ "\ w \})? [A-za-z -'] * ([AZ] [A-Za-z- '] *)?
Diese Lösung ist richtig, hat aber ein Minus. Wir gingen mit einer "Krücke" ({\ "\ w}) um" {\ "u} herum?" und im Grunde ist es praktikabel, wenn Sie diese Krücke auch in andere Teile der Namen der Autoren einfügen.
Auf jeden Fall ist es sehr cool, wenn Sie dieses Problem irgendwie lösen konnten!
Parsing-Lösung- "[AZ] [A-Za-z - '] +" - Wir suchen nach einem Wort, das notwendigerweise mit einem Großbuchstaben beginnt und dann ein beliebiges Alphabet, einen Bindestrich oder einen Apostroph enthält.
- Außerdem ist alles genau das gleiche wie etwas höher, aber hier dazwischen haben wir "({\" \ w})? "- es ist nur eine Krücke, mit der Sie die Abschirmung umgehen können. Dies bedeutet, dass ein Stück" {\ "u}" entweder vorhanden sein kann oder abwesend sein.
- Und andererseits genau das Gleiche wie im ersten Fall "([AZ] [A-Za-z - '] *)?". Der Hinweis ist mit der Ausnahme, dass dieser Ausdruck in eine Gruppe eingeschlossen ist und ein "?" was bedeutet, diese Bedingung nicht zu binden.
Die PS [A-Za-z] -Aufzählung ist hier eine notwendige Maßnahme, da der Test keine Modifikatoren enthält.
Beste LösungEs gibt eine kompaktere und einfachere Lösung, mit der Sie die oben genannte Krücke verlassen können:
[AZ] \ S +, [AZ] \ S * ([AZ] [\ S] *)? \ B.
Parsing-Lösung- "[AZ] \ S +" - zuerst unbedingt der Großbuchstabe "[AZ]", dann eine beliebige Anzahl von Nicht-Leerzeichen "\ S +" zum Semikolon ",".
- Weiter fast das gleiche "[AZ] \ S *" - der Anfang ist notwendigerweise mit einem Großbuchstaben und dann einem Nicht-Leerzeichen bis zum Rand des Wortes "\ b".
- "([AZ] [\ S] *)?" - und zwischen ihnen die gleiche, aber nicht obligatorische Gruppe für einen zweiten Vornamen.
Aufgabe 11 - Header-Inhalt
Genau wie in Aufgabe 8, aber Sie müssen nicht die Header selbst finden, sondern deren Inhalt.
Schwierigkeit: schwierig.
HinweisDie Aufgabe ist identisch mit der Aufgabe 8. Es ist nicht schwierig, wenn Sie wissen, wie man hin und her schaut. Hat eine Lösung mit Rückblick und ohne Rückblick.
LösungOhne zurückzuschauen:
([\ w] * <[^ h]. + | [^ <>] +) (? = <\ / h \ d>)
Parsing-Lösung- "([\ w] * <[^ h]. + | [^ <>] +)" - Es gibt zwei Möglichkeiten, wie der Inhalt des Headers beginnen kann. Das erste befindet sich mit dem Tag in "[\ w] * <[^ h]. +" - gleichzeitig müssen Sie sicherstellen, dass es sich nicht um das h-Tag handelt, und berücksichtigen, dass möglicherweise Text vor dem Tag vorhanden ist. Die zweite Option ist Text ohne Tags "[^ <>] +", dh alle anderen Zeichen als das Öffnen und Schließen des Tags.
- "(? = <\ / h \ d>)" - Blick nach vorne, innerhalb dessen sich ein schließendes Tag h befinden sollte.
Rückblick:
(? <= <h [^>] +>). +? (? = <\ / h \ d>)
Außerdem können Sie alle Kommentare zu Lösung 8 des Problems berücksichtigen.
Parsing-Lösung- "(? <= <h [^>] +>)" - Ein Blick zurück, in dem sich ein Tag h befinden sollte.
- "(? = <\ / h \ d>)" - Blick nach vorne, innerhalb dessen sich ein schließendes Tag h befinden sollte.
Aufgabe 12 - Liste der Autoren
Die Aufgabe ähnelt der 10. Aufgabe, ist aber meiner Meinung nach einfacher.
Schwierigkeit: schwierig.
HinweisAlle Grundprinzipien von 10 Aufgaben, aber Sie müssen den Anfang der Zeile berücksichtigen. Die Lösung, die ich kenne, verwendet das Zurückschauen.
Lösung(? <= ^ \ d + \.) [AZ] [\ w] +, [AZ] [\ w \.] +
Parsing-Lösung- "(? <= ^ \ d +.)" - Rückblick, wo Sie eine beliebige Anzahl von Ziffern bis zu dem Punkt mit einem Leerzeichen aus einer neuen Zeile haben müssen.
- "[AZ] [\ w] +," - weiter jedes Wort von einem Großbuchstaben zu einem Semikolon und noch einmal das gleiche "[AZ] [\ w.] +".
Oder einfach das:
(? <= ^ \ d + \.) [^,] +, [^ ,:] +
Parsing-Lösung- "(? <= ^ \ d +.)" - Rückblick, wo Sie eine beliebige Anzahl von Ziffern bis zu dem Punkt mit einem Leerzeichen aus einer neuen Zeile haben müssen.
- "[^,] +," - eine beliebige Anzahl beliebiger Zeichen für Komma + Komma.
- "[^ ,:] +" - eine beliebige Anzahl von Zeichen vor dem Komma oder Doppelpunkt.