Coding for KidsCoding for Kids
Kreative LevelHerausforderungenLehrerhandbuch
Für Funktionen abstimmen
Fortgeschrittener Python-Entwicklungskurs
Kapitel
>
Stufe

String- und Zeitmodule
Regex-Modul

Ziel

Überprüfen und organisieren Sie Dateien, die Mitarbeiter und Zoneneinteilungen betreffen, mithilfe regulärer Ausdrücke.

In den angrenzenden Büros gibt es einige Dokumente, die aktualisiert werden müssen, da Mitarbeiter ihre Arbeit auf den neuen Ackerflächen aufnehmen und die Zonenaufteilung für den Anbau von Nutzpflanzen und die Pflege von Vieh überarbeitet werden muss. Das Verwalten von Dateien kann ziemlich knifflig sein, vor allem wenn große Mengen an Text verarbeitet werden. Zu diesem Zweck verwenden wir das Modul re, welches eine Abkürzung für Regular Expressions, auch Regex genannt, ist. Wir können auf seine Funktionen zugreifen, indem wir import re verwenden. Für diesen Level nutzen wir die folgenden Funktionen:

  • re.findall(): Gibt eine Liste aller Vorkommnisse eines bestimmten Musters zurück. Nimmt zwei (2) Argumente, wobei das erste angibt, nach welchen Zeichen im String gesucht wird, und das zweite der zu durchsuchende String ist.
  • re.sub(): Ersetzt ein angegebenes Vorkommnis durch einen bestimmten String. Nimmt drei (3) Argumente, wobei das erste das zu ersetzende Muster, das zweite der Ersatzstring und das dritte der String ist, in dem gesucht wird.
  • re.search(): Findet die Position eines bestimmten Musters in einem String und gibt ein Objekt zurück. Nimmt zwei (2) Argumente, das erste ist das Suchmuster und das zweite der String, der durchsucht wird. Sie können weitere Funktionen mit dem zurückgegebenen Objekt verwenden, wie span(), welches ein Tupel der Start- und Endposition des gefundenen Elements im Text zurückgibt.
  • re.split(): Teilt einen String an den angegebenen Trennstellen in eine Liste auf. Nimmt zwei (2) Argumente, wobei das erste angibt, nach welchem Muster der String aufgeteilt werden soll, und das zweite der zu teilende String ist.
  • re.match(): Prüft, ob ein String an seinem Anfang einen bestimmten Wert enthält. Diese Funktion funktioniert ähnlich wie re.search(), ist jedoch effizienter, da sie nur den Anfang des Strings überprüft.

Das re-Modul kann auch spezielle Sequenzen verwenden. Es gibt Codes, die Sie mit den re-Funktionen nutzen können, um eine Vielzahl von String-Eigenschaften zu berücksichtigen. Es gibt eine lange Liste spezieller Sequenzen, aber für diesen Level verwenden wir die folgenden:

  • \B: Überprüft, ob angegebene Zeichen im String vorkommen, aber nicht am Anfang oder Ende eines Wortes.
  • \D: Gibt Zeichen zurück, die keine Ziffern von 0 bis 9 sind.

Wenn ein r vor einer speziellen Sequenz steht, bedeutet dies, dass ein roher String überprüft wird.

Beginnen Sie, indem Sie zur goldenen X-Markierung gehen und sich dem Tisch mit dem Memo zuwenden. Verwenden Sie die read()-Funktion, um das Memo zu überprüfen, das ein Verzeichnis aller Mitarbeiter enthält. Jeder Name enthält ein #, das seine Mitarbeiternummer abgrenzt. Der String, der die Namen enthält, ist zudem in einer Konstante namens manifest gespeichert.

Erstellen Sie eine Liste namens tags und speichern Sie den Wert von re.findall(), der verwendet wird, um alle # im manifest zu finden, wie folgt: tags = re.findall("#", manifest). Erstellen Sie eine Variable namens number und verwenden Sie len() mit der tags-Liste, um zu zählen, wie viele Elemente sich in der Liste befinden. So erfahren wir, wie viele Mitarbeiter im Verzeichnis aufgeführt sind. Verwenden Sie die speak()-Funktion mit der Variable number, um anzukündigen, wie viele Namen sich in der Liste befinden.

Als Nächstes gehen Sie zur leichten X-Markierung neben dem blauen Teppich, wenden sich dem Schreibtisch zu und verwenden die read()-Funktion. Hier finden Sie eine Liste neuer Mitarbeiter mit ihren zugewiesenen Positionen. Notieren Sie sich die Namen in jeder Berufsgruppe, damit Sie diese mit den aktuell zugewiesenen Personen abgleichen können. Gehen Sie weiter zur X-Markierung über dem blauen Teppich und verwenden Sie erneut read(), um die aktuell zugewiesenen Jobs zu überprüfen.

Die aktuelle Belegschaft ist in einer Konstante namens assignments gespeichert. Wir müssen dieses Dokument mit den Informationen aus der Liste der neuen Mitarbeiter aktualisieren. Ersetzen Sie die Namen, die von der Liste abweichen, mithilfe der re.sub()-Funktion, um einen Teil des Strings durch einen anderen zu ersetzen. Zum Beispiel erfolgt eine der Änderungen folgendermaßen:

assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)

Der Name "Billy Hodgins" wird im Dokument durch "Carol Hopkins" ersetzt. Abgesehen von dieser Änderung durchsuchen Sie das Dokument und aktualisieren Sie diesen und einen weiteren Namen aus der Liste, um das Dokument vollständig zu aktualisieren. Verwenden Sie die write()-Funktion mit assignments, um die Ergebnisse zu überprüfen.

Nachdem wir uns um die Mitarbeiterlisten gekümmert haben, ist es Zeit, zur Zoneneinteilung der Farm überzugehen. Gehen Sie zur dunklen X-Markierung über dem roten Teppich und verwenden Sie die read()-Funktion. Diese zeigt Ihnen eine detaillierte Übersicht der Zonenaufteilung. Diese Informationen sind in einer Konstante namens zones gespeichert.

Besonders wichtig ist es, die Position von 6210 im Dokument zu identifizieren, da diese Zone neu bewertet werden muss. Dafür verwenden wir die re.search()-Funktion, um die Position dieser Sektornummer in der Zoneneinteilung zu finden. Erstellen Sie eine Variable namens index und speichern Sie das Suchobjekt, wobei Sie die Suche auf r"6210\B" setzen. Das bedeutet: Das r signalisiert, dass es sich um einen rohen String handelt, 6210 ist der gesuchte Zonen-Sektor, und \B stellt das spezielle Suchkriterium dar. Dies wird wie folgt ausgeführt: index = re.search(r"6210\B", zones).

Da index nun ein Suchobjekt enthält, ist es an der Zeit, Daten daraus mit der Funktion span() zu extrahieren. Erstellen Sie eine Variable namens vector und speichern Sie die Position des Suchobjekts, so: vector = index.span(). Sobald dies eingerichtet ist, verwenden Sie die vector-Variable mit der vorgegebenen write()-Funktion.

Als Nächstes identifizieren wir die Zonenbereiche. Gehen Sie zur dunklen X-Markierung über dem grünen Teppich. Erstellen Sie eine Liste namens sectors und verwenden Sie die re.split()-Funktion, um alle verschiedenen Zonenbereiche in einer Liste zusammenzufassen. Bei der split()-Funktion verwenden Sie die spezielle Sequenz "\D", um nur die Zahlen aus der zones-Variable zu extrahieren. Verwenden Sie eine List Comprehension, um alle leeren Einträge in der Liste zu entfernen, indem Sie die len()-Funktion nutzen, um Elemente zu entfernen, die zu kurz sind, um eine Zonen-Nummer darzustellen. So sieht das aus:

sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]

Verwenden Sie die zones-Variable zusammen mit der write()-Funktion, um alle Zonenbereiche aufzulisten.

Gehen Sie zur leichten X-Markierung neben dem lila Teppich und wenden Sie sich dem Aktenschrank zu. Verwenden Sie die read()-Funktion, um prioritäre Zonen in der Farmzoneneinteilung zu überprüfen. Notieren Sie sich die Sektoren, da wir überprüfen müssen, ob diese Sektoren in der Zoneliste vorhanden sind.

Gehen Sie zur dunklen X-Markierung über dem lila Teppich. Es gibt drei (3) prioritäre Sektoren in Variablen namens: sector_a, sector_b, sector_c, die im Code-Editor bereits vorgegeben sind. Fügen Sie die Werte ein, die Sie an der leichten X-Markierung abgelesen haben. Diese Variablen verwenden eine List Comprehension, die alle Elemente in der sectors-Liste durchläuft und sie mit der re.match()-Funktion filtert. Verwenden Sie die Variablen sector_a, sector_b, sector_c und fügen Sie diese in die vorgegebene write()-Funktion ein, um das Level abzuschließen.

Codebuch