Coding for KidsCoding for Kids
Kreativa NivåerUtmaningarLärarguide
Rösta på funktioner
Avancerad Pythonutvecklingskurs
Kapitel
>
Nivå

Sträng- och tidsmoduler
Regex-modul

Mål

Verifiera och organisera filer som rör anställda och zonindelningar genom att använda reguljära uttryck.

I de angränsande kontoren finns viss dokumentation som behöver uppdateras gällande anställda som påbörjar sitt arbete på den nya jordbruksmarken samt zonindelningen för var grödor och boskap ska skötas. Att hantera filer kan vara ganska knepigt, särskilt när man arbetar med stora mängder textsträngar. För detta ändamål kommer vi att använda re-modulen, som är en förkortning för Regular Expressions, även kallat Regex. Vi kan komma åt dess funktioner genom att använda import re. För ändamålet i denna nivå kommer vi att använda följande funktioner:

  • re.findall(): Returnerar en lista med alla förekomster av en sträng. Tar två (2) argument, det första är vilka tecken du letar efter i en sträng, det andra är strängen att söka i.
  • re.sub(): Ersätter en angiven förekomst med en viss sträng. Tar tre (3) argument, det första är vilka tecken du vill ersätta, det andra är vad du vill ersätta dem med och det tredje är strängen du vill söka i.
  • re.search(): Hittar platsen för något i en sträng och returnerar ett objekt. Tar två (2) argument, de tecken du söker efter och strängen du söker i. Du kan använda andra funktioner med objektet som returneras, såsom span() som returnerar en vektor med start- och slutpositionen för det sökta objektet i texten.
  • re.split(): Delar en sträng till en lista vid angivna punkter. Tar två (2) argument, det första är var strängen ska delas och det andra är strängen du vill dela.
  • re.match(): Kontrollerar om en sträng innehåller ett visst värde i början av strängen. Detta fungerar som en förenklad version av re.search()-funktionen men är mer effektiv och kontrollerar om strängen du söker i har frågeordet i början.

re-modulen kan också använda specialsekvenser, det finns koder som du kan använda med re-funktionerna för att inkludera en mängd olika strängegenskaper. Det finns en lång lista med specialsekvenser men för denna nivå kommer vi att använda följande:

  • \B: Kontrollerar om angivna tecken finns i strängen men inte är placerade i början eller slutet av ett ord.
  • \D: Returnerar tecken som inte är siffror 0-9

Om ett r förekommer med en specialsekvens, betyder det att den kontrollerar den råa strängen.

Börja med att gå till guldkrysset (X-märket) och vända dig mot bordet med memot. Använd funktionen read() för att kontrollera memot som innehåller en manifestlista över alla anställda. Varje namn innehåller # vilket avgränsar deras anställningsnummer, och strängen som innehåller namnen är också lagrad i en konstant som heter manifest.

Skapa en lista som heter tags och lagra värdet från re.findall(), som används för att söka efter alla # i manifest-konstanten, på följande sätt: tags = re.findall("#", manifest). Skapa en variabel som heter number och använd len() med tags-listan för att räkna hur många objekt som finns i listan, detta gör att vi vet hur många anställda det finns i manifestet. Använd funktionen speak() med variabeln number för att meddela hur många namn det finns i listan.

Nästa steg, gå till ljusgröna/korsmärket (X-märket) bredvid den blå mattan och vänd dig mot skrivbordet samt använd funktionen read(). Här kommer du att hitta en lista över nyanställda med deras tilldelade positioner. Notera namnen i varje yrke så att du kan jämföra med de personer som för närvarande är tilldelade. Gå sedan till X-märket över den blå mattan och använd read() igen för att verifiera de nuvarande tilldelade jobben.

Den nuvarande arbetsstyrkan är lagrad i en konstant som heter assignments. Vi måste uppdatera detta dokument med informationen från listan över nyanställda. Ersätt de namn som skiljer sig i listan genom att använda funktionen re.sub() för att byta ut en del av strängen mot en annan. Till exempel, en av ändringarna är följande:

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

Namnet "Billy Hodgins" ersätts med "Carol Hopkins" i dokumentet. Förutom denna ändring, skanna dokumentet och uppdatera detta samt ett annat namn i listan för att helt uppdatera dokumentet. Använd funktionen write() med assignments för att kontrollera resultatet.

Nu när vi har tagit hand om personallistorna är det dags att gå vidare till zonindelningen för gården. Gå till det mörka X-märket över den röda mattan och använd funktionen read(), detta visar dig en detaljerad översikt av zonindelningen. Denna information är lagrad i en konstant som heter zones.

Av särskild vikt är det att identifiera platsen för 6210 i dokumentet eftersom zonen behöver ses över. För att göra detta måste vi använda funktionen re.search() för att identifiera platsen för det sektionsnumret i zonindelningen. Skapa en variabel som heter index och lagra sökobjektet, ställ in sökningen till r"6210\B". Det här gör att r söker efter en rå sträng, 6210 är den sektionszon vi letar efter, och \B är den speciella sekvenskriteriet för sökningen. Detta utförs så här: index = re.search(r"6210\B", zones).

Nu när index innehåller ett sökobjekt är det dags att extrahera data från det med funktionen span(). Skapa en variabel som heter vector och lagra platsen för sökobjektet, på följande sätt: vector = index.span(). När detta är klart, använd vektorvariabeln med den förskrivna write().

Nästa steg är att identifiera zonindelningens komponenter. Gå till det mörka X-märket över den gröna mattan. Skapa en lista som heter sectors och använd funktionen re.split() för att samla alla de olika zonsektorerna i en lista. I split-funktionen, använd den speciella sekvensen "\D" för att endast ta med siffrorna från zones-variabeln. Använd en listförståelse för att ta bort eventuella tomma element i listan genom att använda funktionen len() för att filtrera bort objekt som är för små för att vara ett sektionsnummer. Så här gör du:

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

Använd zones med funktionen write() för att skriva ut alla zonsektorer.

Gå till det ljusa X-märket bredvid den lila mattan och vänd dig mot arkivskåpet, använd funktionen read() för att verifiera prioriterade sektorer i jordbruksmarkens zonindelning. Notera sektorerna då vi behöver verifiera om dessa sektorer finns med i zonlistan.

Gå till det mörka X-märket över den lila mattan, där finns tre (3) prioriterade sektorer i variablerna: sector_a, sector_b, sector_c, förskrivna i kodeditorn. Infoga de värden du läste vid det ljusa X-märket. Dessa variabler använder en listförståelse som går igenom alla objekt i sectors-listan och filtrerar dem genom funktionen re.match(). Använd variablerna sector_a, sector_b, sector_c och infoga dem i den förskrivna write()-funktionen för att slutföra nivån.

Kodbok