Coding for KidsCoding for Kids
Poziomy KreatywneWyzwaniaPrzewodnik dla Nauczycieli
Głosuj na funkcje
Zaawansowany kurs programowania w Pythonie
Rozdział
>
Poziom

Moduły łańcuchów znaków i czasu
Moduł Regex

Cel

Zweryfikuj i uporządkuj pliki dotyczące pracowników i przydziału stref, używając wyrażeń regularnych.

W sąsiednich biurach znajduje się dokumentacja, którą należy zaktualizować w odniesieniu do pracowników rozpoczynających pracę na nowym polu uprawnym oraz stref, w których mają być uprawiane rośliny i hodowane zwierzęta. Zarządzanie plikami może być dość trudne, szczególnie przy obsłudze dużej ilości tekstu. W tym celu użyjemy modułu re, będącego skrótem od Regular Expressions, czyli wyrażeń regularnych (Regex). Do funkcji tego modułu uzyskamy dostęp za pomocą import re. Na potrzeby tego poziomu użyjemy następujących funkcji:

  • re.findall(): Zwraca listę wszystkich wystąpień danego ciągu znaków. Przyjmuje dwa (2) argumenty – pierwszy to ciąg, którego szukasz, a drugi to ciąg, w którym następuje wyszukiwanie.
  • re.sub(): Zastępuje wskazane wystąpienie określonym ciągiem znaków. Przyjmuje trzy (3) argumenty – pierwszy to ciąg, który chcesz zastąpić, drugi to ciąg zastępczy, a trzeci to tekst, w którym szukasz ciągu do zastąpienia.
  • re.search(): Znajduje lokalizację określonego ciągu w tekście, zwracając obiekt. Przyjmuje dwa (2) argumenty – ciąg, którego szukasz, oraz tekst, w którym następuje wyszukiwanie. Obiekt zwrócony przez tę funkcję umożliwia użycie dodatkowych metod, takich jak span(), która zwraca wektor określający pozycje początkową i końcową znalezionego ciągu.
  • re.split(): Dzieli tekst na listę według określonych kryteriów. Przyjmuje dwa (2) argumenty – pierwszy określa, według jakiego wzorca nastąpi podział, a drugi to tekst do podziału.
  • re.match(): Sprawdza, czy tekst zaczyna się od określonego ciągu znaków. Działa podobnie do funkcji re.search(), jednak jest bardziej wydajna, ponieważ sprawdza tylko początek ciągu.

Moduł re pozwala również na wykorzystanie sekwencji specjalnych – kodów, które umożliwiają sprawdzanie różnych właściwości tekstu. Istnieje długa lista sekwencji specjalnych, ale na potrzeby tego poziomu użyjemy następujących:

  • \B: Sprawdza, czy określone znaki występują w tekście, ale nie na początku ani na końcu słowa.
  • \D: Zwraca znaki, które nie są cyframi od 0 do 9.

Jeśli przed sekwencją specjalną występuje r, oznacza to, że sprawdzany jest surowy (raw) ciąg znaków.

Zacznij od przejścia do znaku X oznaczonego na złoto i skierowania się w stronę stołu z notatką. Użyj funkcji read(), aby przeczytać notatkę zawierającą manifest wszystkich pracowników. Każde imię zawiera #, który oddziela numer pracownika, a ciąg znaków z imionami jest przechowywany w stałej o nazwie manifest.

Utwórz listę o nazwie tags i przypisz do niej wynik działania funkcji re.findall(), która wyszukuje wszystkie wystąpienia # w stałej manifest, w następujący sposób: tags = re.findall("#", manifest). Następnie utwórz zmienną o nazwie number i użyj funkcji len() na liście tags, aby policzyć, ile elementów znajduje się na liście – pozwoli to ustalić liczbę pracowników wymienionych w manifeście. Użyj funkcji speak() z zmienną number, aby ogłosić, ile imion znajduje się na liście.

Następnie przejdź do znaku X oznaczonego światłem obok niebieskiego dywanu i skieruj się do biurka, używając funkcji read(). Znajdziesz tam listę nowych pracowników wraz z przypisanymi stanowiskami. Zanotuj imiona przypisane do poszczególnych zawodów, aby móc porównać je z aktualnie przypisanymi osobami. Następnie przejdź do znaku X na niebieskim dywanie i ponownie użyj funkcji read(), aby zweryfikować aktualnie przydzielone stanowiska.

Obecna kadra jest przechowywana w stałej o nazwie assignments. Musimy zaktualizować ten dokument, wykorzystując informacje z listy nowych pracowników. Zamień imiona, które różnią się od tych w nowej liście, używając funkcji re.sub() do podmiany jednej części tekstu na inną. Na przykład, jedna z modyfikacji wygląda następująco:

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

Imię "Billy Hodgins" zostanie zastąpione przez "Carol Hopkins" w dokumencie. Oprócz tej zmiany, przeskanuj dokument i zaktualizuj jeszcze jedno imię z listy, aby w pełni odzwierciedlić zmiany. Użyj funkcji write() z argumentem assignments, aby sprawdzić wyniki.

Skoro zajęliśmy się listami pracowników, pora przejść do strefowania gospodarstwa. Przejdź do ciemnego znaku X na czerwonym dywanie i użyj funkcji read(), aby zapoznać się ze szczegółowym przeglądem stref. Informacje te są przechowywane w stałej o nazwie zones.

Szczególnie ważne jest zidentyfikowanie lokalizacji 6210 w dokumencie, ponieważ dana strefa wymaga ponownej oceny. Aby to zrobić, użyj funkcji re.search(), aby określić pozycję tego numeru sektora w strefach. Utwórz zmienną o nazwie index i przypisz do niej obiekt zwrócony przez wyszukiwanie, ustawiając wzorzec na r"6210\B". Oznacza to, że r wskazuje na surowy ciąg, 6210 to poszukiwany numer sektora, a \B to kryterium sekwencji specjalnej. Wykonujesz to w następujący sposób: index = re.search(r"6210\B", zones).

Skoro zmienna index zawiera obiekt wyszukiwania, czas wyodrębnić z niego dane, używając metody span(). Utwórz zmienną o nazwie vector i przypisz do niej wynik działania index.span(), w następujący sposób: vector = index.span(). Następnie użyj zmiennej vector w przygotowanej funkcji write().

Kolejnym krokiem jest identyfikacja elementów strefowych. Przejdź do ciemnego znaku X na zielonym dywanie. Utwórz listę o nazwie sectors i użyj funkcji re.split(), aby scalić wszystkie różne sektory stref w jedną listę. W funkcji split użyj sekwencji specjalnej "\D", aby wydobyć tylko liczby ze stałej zones. Następnie, używając wyrażenia listowego, usuń puste elementy z listy, wykorzystując funkcję len(), aby wyeliminować pozycje zbyt krótkie, by być numerem sektora. Przykładowy kod:

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

Następnie użyj funkcji write() z argumentem zones, aby zanotować wszystkie sektory stref.

Przejdź do znaku X oznaczonego światłem obok fioletowego dywanu i skieruj się do szafki na dokumenty, używając funkcji read(), aby zweryfikować sektory priorytetowe w strefowaniu gospodarstwa. Zanotuj te sektory, gdyż musimy sprawdzić, czy znajdują się one na liście sektorów.

Przejdź do ciemnego znaku X na fioletowym dywanie. Znajdziesz tam trzy (3) priorytetowe sektory, zapisane w zmiennych o nazwach: sector_a, sector_b, sector_c, wstępnie zadeklarowanych w edytorze kodu. Wstaw do nich wartości odczytane ze stanowiska oznaczonego światłem. Zmienne te korzystają z wyrażenia listowego, które przegląda wszystkie elementy listy sectors i filtruje je przy pomocy funkcji re.match(). Użyj zmiennych sector_a, sector_b, sector_c i wstaw je do przygotowanej funkcji write(), aby ukończyć poziom.

Księga Kodów