Edistynyt Python-kehityskurssi
Luku
>
Taso
Merkkijono- ja aikamoduulit
Regex-moduuli
Tavoite
Varmista ja järjestä työntekijöihin ja vyöhykkeiden allokointeihin liittyvät tiedostot käyttäen säännöllisiä lausekkeita.
Naapuritoimistoissa on dokumentaatiota, jota on päivitettävä koskien työntekijöiden aloittamista uudella maatilalla ja vyöhykkeitä, joissa viljellyt kasvit ja karja hoidetaan. Tiedostojen hallinta voi olla varsin haastavaa, erityisesti kun käsitellään suuria määriä tekstiä. Tätä tarkoitusta varten käytämme re-moduulia, joka on lyhenne sanoista Regular Expressions, tunnetaan myös nimellä Regex. Voimme käyttää sen funktioita lisäämällä import re, ja tämän tason tarpeisiin käytämme seuraavia funktioita:
re.findall(): Palauttaa listan kaikista merkkijonon esiintymistä. Ottaa kaksi (2) argumenttia, ensimmäinen on etsittävät merkit ja toinen on merkkijono, josta etsitään.re.sub(): Korvaa merkkijonosta tietyn esiintymän toisella merkkijonolla. Ottaa kolme (3) argumenttia, ensimmäinen on korvattavat merkit, toinen mihin ne korvataan ja kolmas on merkkijono, josta etsitään.re.search(): Etsii jotain merkkijonosta ja palauttaa objektin. Ottaa kaksi (2) argumenttia: etsittävät merkit ja merkkijono, josta etsitään. Voit käyttää objektin mukana olevia funktioita, kutenspan(), joka palauttaa haetun kohteen aloitus- ja lopetusasemat tekstissä.re.split(): Jakaa merkkijonon listaksi määritellyissä kohdissa. Ottaa kaksi (2) argumenttia, ensimmäinen määrittää, mihin kohtaan merkkijono jaetaan ja toinen on merkkijono, josta halutaan jakaa.re.match(): Tarkistaa, sisältääkö merkkijono tietyn arvon merkkijonon alussa. Tämä toimii yksinkertaistettuna versionare.search()-funktiosta, mutta on tehokkaampi, koska se tarkistaa vain merkkijonon alun.
re-moduuli voi myös käyttää erityismerkintöjä; on olemassa koodeja, joita voi käyttää re-funktioiden yhteydessä, ja jotka mahdollistavat erilaisten merkkijonomaisten ominaisuuksien käsittelyn. Erityismerkintöjä on pitkä lista, mutta tämän tason tarpeisiin käytämme seuraavia:
\B: Tarkistaa, ovatko tietyt merkit merkkijonossa, mutta eivät sijaitse sanan alussa tai lopussa.\D: Palauttaa merkit, jotka eivät ole numeroita 0-9.
Jos erikoismerkin yhteydessä on r, se tarkoittaa, että tarkastellaan raakaa merkkijonoa.
Aloita kävelemällä kohti kultainen X-merkki ja suuntaamalla pöytää kohti, jolla on muistio. Käytä read()-funktiota tarkistaaksesi muistiinpano, joka sisältää luettelon kaikista työntekijöistä. Jokaisessa nimessä on #, joka erottaa heidän työntekijänumeronsa; nimiä sisältävä merkkijono on tallennettu vakioon nimeltä manifest.
Luo lista nimeltä tags ja tallenna siihen re.findall()-funktion palauttama arvo, joka etsii kaikki #-merkit manifest-vakion sisältä, esimerkiksi: tags = re.findall("#", manifest). Luo muuttuja nimeltä number ja käytä len()-funktiota tags-listan koon laskemiseen, mikä kertoo, kuinka monta työntekijää manifestissa on. Käytä speak()-funktiota number-muuttujan kanssa ilmoittaaksesi, kuinka monta nimeä listalla on.
Seuraavaksi kävele vaalean X-merkkiä kohti sinisen maton vieressä ja suuntaa pöydän suuntaan käyttäen read()-funktiota. Tässä saat listan uusista työntekijöistä ja heidän määräytyneistä tehtävistään. Tee muistiinpanoja kunkin ammattiryhmän nimistä, jotta voit vertailla niitä nykyisiin tehtäviin. Kävele X-merkkiä kohti sinisen maton yllä ja käytä read()-funktiota uudelleen varmistaaksesi nykyiset työtehtävät.
Nykyinen työvoima on tallennettu vakioon nimeltään assignments; meidän täytyy päivittää tämä dokumentti uusien työntekijöiden tietojen mukaisesti. Korvaa listalla olevat erilaiset nimet käyttäen re.sub()-funktiota, joka vaihtaa osan merkkijonosta toiseksi. Esimerkiksi yksi muutos tehdään seuraavasti:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
Nimi "Billy Hodgins" korvataan dokumentissa nimellä "Carol Hopkins". Tämän muutoksen lisäksi käy dokumentti läpi ja päivitä tämä ja yksi muu nimi listalta, jotta dokumentti on täysin ajan tasalla. Käytä write()-funktiota assignments-muuttujan kanssa tarkistaaksesi tulokset.
Nyt kun olemme hoitaneet työntekijöiden listat, on aika siirtyä maatilan vyöhykkeiden pariin. Kävele tumman X-merkin luo punaisen maton yli ja käytä read()-funktiota, joka näyttää sinulle yksityiskohtaisen katsauksen vyöhykkeiden jakautumiseen. Tämä tieto on tallennettu vakioon nimeltä zones.
On erityisen tärkeää tunnistaa dokumentista sijainti, jossa esiintyy 6210, sillä kyseinen vyöhyke on arvioitava uudelleen. Tätä varten meidän täytyy käyttää re.search()-funktiota paikantaaksemme kyseisen sektornumeron sijainnin vyöhykkeissä. Luo muuttuja nimeltä index ja tallenna siihen hakutulos, käyttäen hakuehtona r"6210\B". Näin r ilmoittaa, että kyseessä on raakamerkkijono, 6210 on etsittävä vyöhykkeen numero ja \B on erikoisehto haulle. Tämä suoritetaan näin: index = re.search(r"6210\B", zones).
Nyt kun index sisältää hakutuloksen objektin, on aika poimia siitä tietoa käyttäen span()-funktiota. Luo muuttuja nimeltä vector ja tallenna siihen haun palauttama sijainti, kuten näin: vector = index.span(). Kun tämä on asetettu, käytä vector-muuttujaa esikirjoitetun write()-funktion kanssa.
Seuraavaksi työstetään vyöhykkeiden kohteiden tunnistamista. Kävele tumman X-merkin luo vihreän maton yli. Luo lista nimeltä sectors ja käytä re.split()-funktiota yhdistääksesi kaikki eri vyöhykkeet listaksi. Funktiossa käytä erikoismerkintää "\D" ottaaksesi vain numerot zones-muuttujasta. Käytä listanmuodostusta (list comprehension) poistaaksesi tyhjät kohdat listasta käyttämällä len()-funktiota, jotta pienikokoiset kohteet, jotka eivät voi olla vyöhykkeen numeroita, suodatetaan pois. Näin:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
Käytä zones-muuttujaa write()-funktioiden kanssa kirjaamaan ylös kaikki vyöhykkeiden sektorit.
Kävele vaalean X-merkin luo violetin maton vieressä ja suuntaa tiedostoja sisältävän kaapin luo; käytä read()-funktiota varmistaaksesi maatilan vyöhykkeiden prioriteettiset sektorit. Tee muistiinpanoja sektoreista, sillä meidän täytyy tarkistaa, ovatko nämä sektorit mukana vyöhykkeiden listassa.
Kävele tumman X-merkin luo violetin maton yli, missä on kolme (3) prioriteettista sektoria, jotka on tallennettu muuttujiin nimeltä: sector_a, sector_b, sector_c, nämä ovat esikirjoitettu koodieditorissa. Syötä niihin arvot, jotka huomasit vaalean X-merkin kohdalta. Nämä muuttujat käyttävät listanmuodostusta, joka käy läpi kaikki sectors-listan kohteet ja suodattaa ne re.match()-funktion avulla. Käytä muuttujia sector_a, sector_b ja sector_c ja sisällytä ne esikirjoitettuun write()-funktioon tason saattamiseksi loppuun.