Pokročilý kurz vývoje v Pythonu
Kapitola
>
Úroveň
Řetězcové a časové moduly
Modul Regex
Cíl
Ověřte a uspořádejte soubory týkající se zaměstnanců a rozdělení zón pomocí regulárních výrazů.
V přilehlých kancelářích se nachází dokumentace, kterou je třeba aktualizovat ohledně zaměstnanců, kteří začínají pracovat na nové farmě, a co se týče rozdělení zón, kde se bude starat o plodiny a hospodářská zvířata. Práce se soubory může být celkem složitá, zejména při zpracování velkého množství textu. K tomuto účelu budeme používat modul re, což je zkratka pro regulární výrazy, také známé jako Regex. Funkce z tohoto modulu můžeme načíst pomocí import re; pro tuto úroveň budeme používat následující funkce:
re.findall(): Vrátí seznam všech výskytů zadaného řetězce. Bere dva (2) argumenty, první je to, jaké znaky hledáte v řetězci, druhý je řetězec, ve kterém se má vyhledávat.re.sub(): Nahradí určený výskyt určitým řetězcem. Bere tři (3) argumenty, první je řetězec, který chcete nahradit, druhý je hodnota, kterou chcete použít jako náhradu, a třetí je řetězec, ve kterém se má vyhledávat.re.search(): Najde umístění hledaného výrazu v řetězci a vrátí objekt. Bere dva (2) argumenty, první jsou znaky, které hledáte, a druhý je řetězec, ve kterém hledáte. Na objektu, který vrací, můžete používat další funkce, napříkladspan(), která vrací vektor začátku a konce vyhledaného výrazu.re.split(): Rozdělí řetězec do seznamu na základě zadaných oddělovačů. Bere dva (2) argumenty, první určuje, podle čeho se řetězec rozdělí, a druhý je řetězec, který chcete rozdělit.re.match(): Zkontroluje, zda řetězec obsahuje danou hodnotu na jeho začátku. Funguje jako zjednodušená verze funkcere.search(), ale je efektivnější, protože kontroluje, zda řetězec začíná požadovanou hodnotou.
Modul re může také používat speciální posloupnosti, tedy kódy, které můžete využít s funkcemi modulu re a které umožňují zahrnout různé vlastnosti řetězců. Existuje dlouhý seznam speciálních posloupností, ale pro tuto úroveň budeme používat následující:
\B: Zkontroluje, zda zadané znaky se v řetězci nacházejí, ale nejsou umístěny na začátku nebo na konci slova.\D: Vrací znaky, které nejsou číslice 0-9.
Pokud je u speciální posloupnosti přítomno r, znamená to, že se kontroluje syrový (raw) řetězec.
Začněte tím, že půjdete ke zlaté X značce a postavíte se čelem ke stolu s poznámkou, poté použijte funkci read() k přečtení poznámky, která obsahuje manifest všech zaměstnanců.
Každé jméno obsahuje #, které odděluje číslo zaměstnance. Řetězec obsahující jména je také uložen v konstantě s názvem manifest.
Vytvořte seznam s názvem tags a uložte do něj výsledek funkce re.findall(), kterou použijete k vyhledání všech znaků # v konstantě manifest, například takto: tags = re.findall("#", manifest).
Vytvořte proměnnou s názvem number a pomocí funkce len() spočítejte, kolik položek je v seznamu tags. Tím zjistíte, kolik zaměstnanců je v manifestu.
Použijte funkci speak() s proměnnou number a ohlaste, kolik jmen je v seznamu.
Dále se vydejte ke světlé X značce vedle modrého koberce, postavte se čelem ke stolu a použijte funkci read().
Zde najdete seznam nových zaměstnanců s jejich přiřazenými pozicemi. Poznamenejte si jména u každého povolání, abyste je mohli porovnat s aktuálně přiřazenými osobami.
Přejděte k X značce na modrém koberci a znovu použijte read(), abyste ověřili aktuálně přiřazené pracovní pozice.
Aktuální pracovní síla je uložena v konstantě nazvané assignments, kterou musíme aktualizovat informacemi ze seznamu nových zaměstnanců.
Nahraďte jména, která se liší, pomocí funkce re.sub(), která nahradí jednu část řetězce druhou. Například jedna z úprav vypadá takto:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
Jméno "Billy Hodgins" je v dokumentu nahrazeno "Carol Hopkins". Kromě této změny projděte dokument a aktualizujte toto a ještě jedno jméno v seznamu, aby byl dokument plně aktualizován. Použijte funkci write() s proměnnou assignments a zkontrolujte výsledky.
Nyní, když jsme se postarali o seznamy zaměstnanců, je čas přejít k rozdělení zón na farmě. Vydejte se ke tmavé X značce na červeném koberci a použijte funkci read(), která vám zobrazí podrobný přehled zón. Tyto informace jsou uloženy v konstantě zones.
Zvláště je důležité identifikovat umístění 6210 v dokumentu, protože danou zónu je třeba přehodnotit. K tomuto účelu je třeba použít funkci re.search(), která identifikuje umístění tohoto čísla sektoru v rámci zónování.
Vytvořte proměnnou s názvem index a uložte do ní objekt vyhledávání, přičemž nastavte vyhledávání na r"6210\B". Což znamená, že r hledá syrový řetězec, 6210 je sektor, který hledáme, a \B je kritérium speciální posloupnosti pro vyhledávání. Provádí se to takto: index = re.search(r"6210\B", zones).
Nyní, když proměnná index obsahuje objekt vyhledávání, je čas z něj extrahovat data pomocí funkce span(). Vytvořte proměnnou s názvem vector a uložte do ní umístění vyhledaného objektu, například takto: vector = index.span(). Jakmile je vše nastaveno, použijte proměnnou vector s předpřipravenou funkcí write().
Nyní budeme pracovat na identifikaci položek zón. Vydejte se ke tmavé X značce na zeleném koberci. Vytvořte seznam s názvem sectors a použijte funkci re.split() k seskupení všech různých sektorů zón do jednoho seznamu. U funkce split použijte speciální posloupnost "\D", která z proměnné zones získá pouze číslice. Pomocí list comprehension odstraňte prázdné položky v seznamu, a to tak, že použijete funkci len() k odstranění položek, které jsou příliš krátké na to, aby představovaly číslo sektoru. Takto:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
Použijte zones s funkcí write() k zaznamenání všech sektorů zón.
Vydejte se ke světlé X značce vedle fialového koberce a postavte se čelem k archivní skříni, poté použijte funkci read() k ověření prioritních sektorů v rozdělení zón farmaření. Poznamenejte si sektory, protože je budeme muset ověřit, zda se nacházejí v seznamu zón.
Vydejte se ke tmavé X značce na fialovém koberci. Ve třech (3) proměnných s názvy sector_a, sector_b, sector_c, které jsou předpřipravené v editoru kódu, vložte hodnoty, které jste získali u světlé X značky. Tyto proměnné využívají list comprehension, která projde všechny položky ze seznamu sectors a vyfiltruje je pomocí funkce re.match(). Použijte proměnné sector_a, sector_b, sector_c a vložte je do předpřipravené funkce write(), aby byl level dokončen.