Fejlett Python fejlesztési tanfolyam
Fejezet
>
Szint
Karakterlánc és Idő modulok
Regex modul
Célkitűzés
Ellenőrizze és rendezze az alkalmazottakhoz és az övezeti kiosztásokhoz kapcsolódó fájlokat reguláris kifejezések segítségével.
A szomszédos irodákban van néhány dokumentáció, amelyet frissíteni kell az új mezőgazdasági területen dolgozni kezdő alkalmazottak és a termények, valamint az állattenyésztés gondozására kijelölt övezetek vonatkozásában. A fájlok kezelése eléggé trükkös lehet, különösen nagy mennyiségű szöveg esetén. E célból a re modult fogjuk használni, amely a Reguláris Kifejezések rövidítése, Regex formában is ismert. A függvények eléréséhez használjuk a import re utasítást, és ennek a szintnek a céljaira a következő függvényeket fogjuk alkalmazni:
re.findall(): Visszaadja egy string minden előfordulásának listáját. Két (2) argumentumot vár, az első azt a karakterhalmazt, amit keresünk a stringben, a második pedig a keresendő stringet.re.sub(): Lecseréli a megadott előfordulást egy bizonyos stringre. Három (3) argumentumot vár, az első a cserélendő karakterek, a második, hogy mire cseréljük, a harmadik pedig a keresendő string.re.search(): Megkeresi egy adott elem helyét a stringben, és egy objektumot ad vissza. Két (2) argumentumot vár: a keresett karaktereket és a stringet, amiben keresünk. Az általa visszaadott objektummal további függvényeket is használhatunk, például aspan(), amely a keresett elem szövegbeli kezdő és végpozícióját adja vissza egy vektorban.re.split(): Szétválasztja a stringet egy listává a megadott elválasztási pontoknál. Két (2) argumentumot vár, az első a szeparátor, a második pedig a szétválasztandó string.re.match(): Ellenőrzi, hogy a string elején szerepel-e egy bizonyos érték. Ez úgy működik, mint egy leegyszerűsítettre.search()függvény, de hatékonyabb, mivel azt vizsgálja, hogy a keresett string elején szerepel-e a minta.
A re modul speciális szekvenciákat is képes használni; vannak kódok, amelyeket a re függvényeivel alkalmazhatunk, és amelyek számos string tulajdonságot képesek lefedni. Bár a speciális szekvenciák listája hosszú, ezen a szinten a következőket fogjuk használni:
\B: Ellenőrzi, hogy a megadott karakterek szerepelnek-e a stringben, de nem egy szó elején vagy végén.\D: Visszaadja azokat a karaktereket, amelyek nem a 0-9 közötti számjegyek.
Ha egy r szerepel egy speciális szekvencia előtt, az azt jelenti, hogy a nyers stringet vizsgálja.
Kezdje azzal, hogy elindul a sárga X jel felé, és forduljon arra az asztalra, ahol a memo található. Használja a read() függvényt a memo ellenőrzéséhez, amely egy manifestot tartalmaz az összes alkalmazottról. Minden névben szerepel egy #, amely elválasztja az alkalmazotti számot, és a neveket tartalmazó string egy manifest nevű konstansban van tárolva.
Hozzon létre egy tags nevű listát, és tárolja benne a re.findall() értékét, amellyel a manifest konstansban keresi az összes #-t, például így: tags = re.findall("#", manifest). Hozzon létre egy number nevű változót, és használja a len() függvényt a tags listával, hogy megszámolja, hány elem van a listában; ez megmutatja, hány alkalmazott szerepel a manifestban. Használja a speak() függvényt a number változóval, hogy bejelentse, hány név van a listában.
Ezután haladjon a kék szőnyeg melletti világos X jel felé, forduljon az asztalhoz, és használja a read() függvényt. Itt egy listát talál az új alkalmazottakról és a kijelölt pozícióikról. Jegyezze fel az egyes szakmákhoz tartozó neveket, hogy később keresztül tudja nézni az aktuálisan kijelölt személyek listájával. Menjen a kék szőnyeg feletti X jelhez, és használja újra a read() függvényt az aktuális munkakörök ellenőrzéséhez.
Az aktuális munkaerő az assignments nevű konstansban van tárolva, amelyet frissíteni kell az új alkalmazottak listáján szereplő információkkal. Cserélje le a listában lévő, különböző neveket a re.sub() függvény segítségével, hogy az egyik részét a stringnek egy másik részre cserélje. Például az egyik módosítás így néz ki:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
A "Billy Hodgins" nevet lecseréli a "Carol Hopkins" névre a dokumentumban. Ezen módosításon kívül vizsgálja át a dokumentumot, és frissítse ezt, valamint még egy másik nevet a listában, hogy a dokumentum teljes körűen naprakész legyen. Használja a write() függvényt az assignments változóval az eredmények ellenőrzéséhez.
Most, hogy az alkalmazottak listái rendben vannak, ideje áttérni a farm övezeti kiosztására. Menjen a piros szőnyeg feletti sötét X jelhez, és használja a read() függvényt, amely részletes áttekintést nyújt az övezetekről. Ezeket az információkat a zones nevű konstansban tárolják.
Különös fontosságú az, hogy azonosítsa a 6210 helyét a dokumentumban, mivel ezt az övezetet újra kell értékelni. Ehhez használja a re.search() függvényt, hogy meghatározza annak a zónaszámnak a helyét a zones változóban. Hozzon létre egy index nevű változót, és tárolja benne a keresési objektumot, úgy, hogy a keresést r"6210\B" értékre állítja. Ez úgy működik, hogy az r a nyers stringet jelzi, a 6210 a keresett zónaszám, a \B pedig a speciális szekvencia feltételét adja meg. Ezt a következő módon végezheti el: index = re.search(r"6210\B", zones).
Miután az index egy keresési objektumot tartalmaz, ideje adatot kinyerni belőle a span() segítségével. Hozzon létre egy vector nevű változót, és tárolja benne a keresési objektum helyét, például így: vector = index.span(). Azután használja a vector változót a már előre megírt write() függvénnyel.
Ezután a zónázási elemek azonosításán dolgozunk, menjen a zöld szőnyeg feletti sötét X jelhez. Hozzon létre egy sectors nevű listát, és használja a re.split() függvényt, hogy az összes különféle zónarésszel kapcsolatos adatot egy listába gyűjtse. A split függvénynél használja a speciális szekvenciát "\D", hogy kizárólag a számokat vegye figyelembe a zones változóból. Alkalmazzon egy list comprehension-t az üres elemek eltávolítására, a len() függvény segítségével, hogy csak olyan elemek maradjanak, amelyek elég hosszúak ahhoz, hogy valódi zónaszámnak számítsanak. Például:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
Használja a write() függvényt a zones változóval, hogy felírja az összes zónarésszel kapcsolatos adatot.
Menjen a lila szőnyeg melletti világos X jelhez, és forduljon az irattárhoz, majd használja a read() függvényt, hogy ellenőrizze a mezőgazdasági terület övezeti prioritásait. Jegyezze fel a zónákat, mivel ellenőriznie kell, hogy ezek a zónák szerepelnek-e az övezetek listájában.
Menjen a lila szőnyeg feletti sötét X jelhez; itt három (3) prioritási zónát tartalmazó változó található: sector_a, sector_b, sector_c, amelyeket a kódszerkesztők már előírnak. Illessze be azokat az értékeket, amelyeket a világos X jel esetében olvasott. Ezek a változók egy list comprehension-t alkalmaznak, amely végigmegy a sectors lista elemein, és a re.match() függvény segítségével szűri azokat. Használja a sector_a, sector_b és sector_c változókat, és illessze be őket a már előre megírt write() függvénybe a szint befejezéséhez.