Coding for KidsCoding for Kids
Creatieve LevelsUitdagingenLerarengids
Stem op functies
Gevorderde Python-ontwikkelingscursus
Hoofdstuk
>
Niveau

String- en Tijdmodules
Regex-module

Doelstelling

Controleer en organiseer bestanden met betrekking tot werknemers en zone-indelingen door gebruik te maken van reguliere expressies.

In de aangrenzende kantoren is er documentatie die geüpdatet moet worden betreffende werknemers die hun werk beginnen op de nieuwe landbouwgrond en de zone-indeling voor waar gewassen en vee verzorgd worden. Het beheren van bestanden kan behoorlijk lastig zijn, vooral wanneer je werkt met grote hoeveelheden tekst. Voor dit doel maken we gebruik van de re module, wat een afkorting is voor Regular Expressions, ook wel afgekort als Regex. We kunnen de functies benaderen door import re te gebruiken, en voor dit niveau zullen we de volgende functies toepassen:

  • re.findall(): Geeft een lijst terug van alle voorkomens van een string. Neemt twee (2) argumenten; het eerste is de karakters waarnaar je zoekt in een string, het tweede is de string waarin gezocht wordt.
  • re.sub(): Vervangt een aangegeven voorkoming met een bepaalde string. Neemt drie (3) argumenten; het eerste is de karakters die je wilt vervangen, het tweede is de vervangende string en het derde is de string waarin gezocht wordt.
  • re.search(): Zoekt de locatie van iets in een string en retourneert een object. Neemt twee (2) argumenten; de karakters waarnaar je zoekt en de string waarin gezocht wordt. Je kunt met het retourgegeven object andere functies gebruiken, zoals span() die een vector teruggeeft met de begin- en eindposities van het gezochte item in de tekst.
  • re.split(): Splitst een string in een lijst op bepaalde punten. Neemt twee (2) argumenten; het eerste is het scheidingsteken waarop de string gesplitst wordt en het tweede is de string die je wilt splitsen.
  • re.match(): Controleert of een string een bepaalde waarde bevat aan het begin van de string. Dit werkt als een vereenvoudigde versie van de functie re.search(), maar is efficiënter en controleert of de string waarin je zoekt de query aan het begin heeft.

De re module kan ook speciale sequenties gebruiken; er zijn codes die je met de re-functies kunt toepassen om een verscheidenheid aan string-eigenschappen te omvatten. Er is een lange lijst van speciale sequenties, maar voor dit niveau gebruiken we de volgende:

  • \B: Controleert of de opgegeven karakters in de string voorkomen, maar niet aan het begin of einde van een woord.
  • \D: Geeft karakters terug die geen cijfers (0-9) zijn

Als er een r aanwezig is bij een speciale sequentie, betekent dit dat er naar de raw string wordt gekeken.

Begin met lopen naar het gouden X-teken en richt je op de tafel met de memo. Gebruik de read() functie om de memo te controleren, die een manifest bevat van alle werknemers. Elke naam bevat een # die hun werknemernummer aanduidt, en de string met de namen is ook opgeslagen in een constante genaamd manifest.

Maak een lijst genaamd tags en sla de waarde van re.findall() op, gebruikt om alle # in de manifest constante te zoeken, als volgt: tags = re.findall("#", manifest). Maak een variabele genaamd number en gebruik len() met de tags lijst om te tellen hoeveel items er in de lijst staan; dit laat ons weten hoeveel werknemers er op het manifest staan. Gebruik de speak() functie met de variabele number om aan te kondigen hoeveel namen er op de lijst staan.

Vervolgens, loop naar het lichte X-teken naast het blauwe tapijt en richt je op het bureau en gebruik de read() functie. Hier vind je een lijst van nieuwe medewerkers met hun toegewezen posities. Noteer de namen per beroep zodat je deze kunt vergelijken met de personen die momenteel zijn toegewezen. Loop daarna naar het X-teken over het blauwe tapijt en gebruik opnieuw read() om de momenteel toegewezen functies te verifiëren.

De huidige werknemers zijn opgeslagen in een constante genaamd assignments. We moeten dit document bijwerken met de informatie uit de lijst van nieuwe medewerkers. Vervang de namen die verschillen in de lijst door gebruik te maken van de re.sub() functie om een deel van de string te vervangen door een ander deel. Bijvoorbeeld, een van de bewerkingen is als volgt:

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

De naam "Billy Hodgins" wordt in het document vervangen door "Carol Hopkins". Naast deze wijziging, doorzoek het document en werk deze en nog een andere naam in de lijst bij om het document volledig te actualiseren. Gebruik de write() functie met assignments om de resultaten te controleren.

Nu we de werknemerslijsten hebben bijgewerkt, is het tijd om over te gaan naar de zone-indelingen voor de boerderij. Loop naar het donkere X-teken over het rode tapijt en gebruik de read() functie; dit geeft je een gedetailleerd overzicht van de zone-indelingen. Deze informatie is opgeslagen in een constante genaamd zones.

Het is bijzonder belangrijk om de locatie van 6210 in het document te identificeren, omdat de zone opnieuw geëvalueerd moet worden. Hiervoor gebruiken we de functie re.search() om de locatie van dat sectornummer in de zone-indeling te bepalen. Maak een variabele genaamd index en sla het zoekobject op; stel de zoekopdracht in op r"6210\B". Wat dit doet, is dat de r zoekt naar een raw string, 6210 is het zone-sectornummer waarnaar we zoeken, en \B is de speciale sequentiecriterium voor de zoekopdracht. Dit wordt als volgt uitgevoerd: index = re.search(r"6210\B", zones).

Nu index een zoekobject bevat, is het tijd om gegevens eruit te halen met span(). Maak een variabele genaamd vector en sla de locatie van het zoekobject op, als volgt: vector = index.span(). Zodra dit is ingesteld, gebruik je de vector variabele met de vooraf geschreven write().

Vervolgens gaan we de zone-items identificeren. Loop naar het donkere X-teken over het groene tapijt. Maak een lijst genaamd sectors en gebruik de re.split() functie om alle verschillende zone-sectoren samen te voegen in een lijst. Gebruik in de split-functie de speciale sequentie "\D" om alleen de cijfers uit de zones variabele te halen. Gebruik een list comprehension om eventuele lege ruimtes in de lijst te verwijderen door de len() functie te gebruiken om items te verwijderen die te klein zijn om een sectornummer te zijn. Bijvoorbeeld zo:

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

Gebruik de zones met de write() functie om alle zone-sectoren in kaart te brengen.

Loop naar het lichte X-teken naast het paarse tapijt en richt je op de archiefkast; gebruik de read() functie om de prioritaire sectoren in de zone-indeling van de boerderij te verifiëren. Noteer de sectoren, want we moeten nagaan of deze sectoren in de zoning-lijst aanwezig zijn.

Loop naar het donkere X-teken over het paarse tapijt. Er zijn drie (3) prioritaire sectoren in variabelen genaamd: sector_a, sector_b, sector_c, vooraf geschreven in de code editors. Vul hierin de waarden in die je bij het lichte X-teken hebt gelezen. Deze variabelen maken gebruik van een list comprehension die door alle items in de sectors lijst gaat en deze filtert met de functie re.match(). Gebruik de variabelen sector_a, sector_b, sector_c en voeg deze in de vooraf geschreven write() functie in om het niveau te voltooien.

Codeboek