Avanceret Python Udviklingskursus
Kapitel
>
Niveau
Streng- og tidsmoduler
Regex Modul
Mål
Verificér og organiser filer vedrørende medarbejdere og zoneinddelinger ved hjælp af regulære udtryk.
I de nærliggende kontorer er der en del dokumentation, der skal opdateres angående medarbejdere, som starter deres arbejde på den nye landbrugsjord, samt zoneinddelingen for, hvor afgrøder og husdyr skal plejes. At håndtere filer kan være ret besværligt, især når man arbejder med store mængder tekststrenge. Til dette formål vil vi bruge modulet re, som er en forkortelse for Regulerære Udtryk, også forkortet som Regex. Vi kan få adgang til dets funktioner ved at bruge import re, og til dette niveau vil vi anvende følgende funktioner:
re.findall(): Returnerer en liste over alle forekomster af en streng. Tager to (2) argumenter; det første er de tegn, du søger efter i en streng, det andet er den streng, der skal søges i.re.sub(): Erstatter den angivne forekomst med en bestemt streng. Tager tre (3) argumenter; det første er de tegn, du ønsker at erstatte, det andet er det, du ønsker at erstatte dem med, og det tredje er den streng, du vil søge i.re.search(): Finder placeringen af noget i en streng, og returnerer et objekt. Tager to (2) argumenter; de tegn, du søger efter, og den streng, du søger i. Du kan bruge andre funktioner med det objekt, det returnerer, såsomspan(), som returnerer en vektor med start- og slutpositionerne for det søgte element i teksten.re.split(): Deler en streng op i en liste ved specificerede intervaller. Tager to (2) argumenter; det første er, hvor strengen skal deles, og det andet er den streng, du ønsker at opdele.re.match(): Kontrollerer om en streng indeholder en bestemt værdi i starten af strengen. Denne fungerer som en forenklet version afre.search()-funktionen, men er mere effektiv og tjekker, om den streng, du søger i, har forespørgslen i starten.
Modulet re kan også bruge specielle sekvenser; der er koder, som du kan bruge med re-funktionerne, der gør det muligt at dække en række forskellige streng-egenskaber. Der er en lang liste af specielle sekvenser, men til dette niveau vil vi anvende følgende:
\B: Kontrollerer, om de angivne tegn er i strengen, men ikke er placeret i starten eller slutningen af et ord.\D: Returnerer tegn, der ikke er cifre 0-9
Hvis der er et r til stede med en speciel sekvens, betyder det, at der kontrolleres en rå streng.
Start med at gå hen til det guld X-mærke og vend dig mod bordet med notatet, brug funktionen read() for at tjekke notatet, som indeholder en oversigt over alle medarbejdere. Hvert navn indeholder #, der afgrænser deres medarbejdernummer; strengen, der indeholder navnene, er også gemt i en konstant kaldet manifest.
Opret en liste kaldet tags og gem værdien af re.findall(), som bruges til at søge efter alle # i manifest-konstanten, således: tags = re.findall("#", manifest). Opret en variabel kaldet number og brug len() med tags-listen for at tælle, hvor mange elementer der er i listen; dette vil give os antallet af medarbejdere på manifestet. Brug funktionen speak() med variablen number til at annoncere, hvor mange navne der er i listen.
Dernæst skal du gå hen til det lyse X-mærke ved siden af det blå tæppe og vende dig mod skrivebordet, og bruge funktionen read(). Her vil du have en liste over nye medarbejdere med deres tildelte stillinger. Noter navnene for hver profession, så du kan krydstjekke med de personer, der aktuelt er tilknyttet. Gå herefter hen til X-mærket over det blå tæppe og brug read() igen for at bekræfte de nuværende jobtildelinger.
Den nuværende arbejdsstyrke er gemt i en konstant kaldet assignments. Vi skal opdatere dette dokument med oplysningerne fra listen over nye medarbejdere. Erstat de navne, der er forskellige i listen, ved at bruge funktionen re.sub() til at erstatte en del af strengen med en anden. For eksempel er en af ændringerne som følger:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
Navnet "Billy Hodgins" erstattes med "Carol Hopkins" i dokumentet. Udover denne ændring, gennemse dokumentet og opdater dette og et andet navn i listen for fuldt ud at opdatere dokumentet. Brug funktionen write() med assignments for at tjekke resultaterne.
Nu hvor vi har taget os af medarbejderlisterne, er det tid til at gå videre til zoneinddelingen for gården. Gå hen til det mørke X-mærke over det røde tæppe og brug funktionen read(), dette vil vise dig en detaljeret gennemgang af zoneinddelingen. Disse oplysninger er gemt i en konstant kaldet zones.
Bemærk særligt, at det er vigtigt at identificere placeringen af 6210 i dokumentet, da zonen skal revurderes. For at gøre dette skal vi bruge funktionen re.search() til at finde placeringen af dette sektornummer i zoneinddelingen. Opret en variabel kaldet index og gem søgeobjektet; sæt søgningen til r"6210\B". Hvad dette gør er, at r leder efter en rå streng, 6210 er den zone, vi leder efter, og \B er kriteriet for den specielle sekvens. Dette udføres sådan her: index = re.search(r"6210\B", zones).
Nu hvor index indeholder et søgeobjekt, er det tid til at udtrække data fra det ved hjælp af span(). Opret en variabel kaldet vector og gem placeringen af søgeobjektet, således: vector = index.span(). Når det er opsat, brug vector-variablen med den forudskrevne write().
Herefter skal vi arbejde med at identificere zoneelementerne. Gå hen til det mørke X-mærke over det grønne tæppe. Opret en liste kaldet sectors og brug funktionen re.split() til at samle alle de forskellige zoneområder i en liste. Ved split-funktionen skal du bruge den specielle sekvens "\D" for kun at tage tallene fra variablen zones. Brug en listeforståelse til at fjerne eventuelle tomme pladser i listen, ved at bruge funktionen len() til at fjerne elementer, der er for små til at være et sektornummer. Som dette:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
Brug zones med funktionen write() for at vise alle zoneområderne.
Gå til det lyse X-mærke ved siden af det lilla tæppe og vend dig mod arkivskabet, brug funktionen read() for at bekræfte prioriterede områder i zoneinddelingen for landbruget. Noter områderne, da vi skal verificere, om disse områder findes i zone-listen.
Gå til det mørke X-mærke over det lilla tæppe; der er tre (3) prioriterede områder i variablerne: sector_a, sector_b, sector_c, forudskrevet i kodeeditoren. Indsæt de værdier, du læste ved det lyse X-mærke. Disse variabler bruger en listeforståelse, der går igennem alle elementerne i sectors-listen og filtrerer dem ved hjælp af funktionen re.match(). Brug variablerne sector_a, sector_b, sector_c og indsæt dem i den forudskrevne write()-funktion for at fuldføre niveauet.