Курс по усъвършенствано разработване с Python
Глава
>
Ниво

Модули за низове и време
Модул за Регулярни Изрази

Цел

Проверете и организирайте файловете, свързани със служителите и разпределението на зоните, като използвате регулярни изрази.

В съседните офиси има документация, която трябва да бъде актуализирана относно служителите, започващи работа на новата ферма, и зоните, в които се отглеждат култури и добитък. Управлението на файловете може да бъде доста сложно, особено при работа с големи обеми текст. Затова ще използваме модула re, който е съкращение от Regular Expressions, също познат като Regex. Функциите му можем да достъпим чрез import re. За целите на това ниво ще използваме следните функции:

  • re.findall(): Връща списък с всички срещания на даден низ. Приема два (2) аргумента, като първият е символите, които търсите в низа, а вторият е низът, в който се търси.
  • re.sub(): Замества указаното срещане с определен низ. Приема три (3) аргумента, като първият е символите, които искате да замените, вторият е стойността, с която искате да ги замените, а третият е низът, в който искате да търсите.
  • re.search(): Намира местоположението на нещо в низа и връща обект. Приема два (2) аргумента – символите, които търсите, и низа, в който търсите. Можете да използвате и други функции с върнатия обект, като например span(), която връща вектор със стартовата и крайната позиция на търсения елемент в текста.
  • re.split(): Разделя низа в списък на зададени интервали. Приема два (2) аргумента, като първият е мястото, по което да се раздели низът, а вторият е самият низ, който искате да разделите.
  • re.match(): Проверява дали низът съдържа определена стойност в началото си. Работи като опростена версия на функцията re.search(), но е по-ефективна и проверява дали в началото на низа се съдържа търсения елемент.

Модулът re може също да използва специални последователности. Има кодове, които можете да използвате с функциите на re, за да обхванете различни свойства на низа. Списъкът със специални последователности е дълъг, но за това ниво ще използваме следните:

  • \B: Проверява дали указаните символи се намират в низа, но не са разположени в началото или края на дума.
  • \D: Връща символи, които не са цифри от 0 до 9

Ако е налично r пред специална последователност, това означава, че се търси суров низ.

Започнете, като отидете до златния X знак и се обърнете към масата с мемото, използвайте функцията read() за да проверите мемото, което съдържа манифест на всички служители. Всяко име съдържа #, който разграничва техния служебен номер; низът, съдържащ имената, също е съхранен в константа с име manifest.

Създайте списък с име tags и запазете стойността от re.findall(), използвана за търсене на всички # в константата manifest, както следва: tags = re.findall("#", manifest). Създайте променлива с име number и използвайте len() със списъка tags, за да преброите колко елементи има в списъка; това ще ни покаже колко служители има в манифеста. Използвайте функцията speak() с променливата number, за да съобщите колко имена има в списъка.

След това, отидете до светлия X знак до синия килим и се обърнете към бюрото, използвайте функцията read(). Тук ще имате списък с новоназначени с техните определени постове. Запомнете имената във всяка професия, за да можете да ги съпоставите с хората, които в момента са назначени. Отидете до X знака върху синия килим и използвайте отново read(), за да проверите текущо назначените длъжности.

Текущият работещ персонал е съхранен в константа с име assignments. Трябва да актуализираме този документ с информацията от списъка с новоназначените. Заменете имената, които са различни в списъка, като използвате функцията re.sub() за да заместите една част от низа с друга. Например, една от промените е както следва:

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

Името "Billy Hodgins" се заменя с "Carol Hopkins" в документа. Освен тази промяна, прегледайте документа и актуализирайте още едно име от списъка, за да актуализирате напълно документа. Използвайте функцията write() с assignments, за да проверите резултатите.

След като се погрижихме за списъците на служителите, е време да преминем към зоните на фермата. Отидете до тъмния X знак върху червения килим и използвайте функцията read(), което ще ви покаже подробен преглед на зоните. Тази информация е запазена в константа с име zones.

Особено важно е да идентифицирате местоположението на 6210 в документа, тъй като зоната трябва да бъде преоценена. За да направим това, трябва да използваме функцията re.search(), за да идентифицираме местоположението на този секторен номер в зоните. Създайте променлива с име index и запазете обекта от търсенето, като настроите търсенето на r"6210\B". Това прави следното: r търси суров низ, 6210 е секторът, който търсим, а \B е специалната последователност за критерия на търсенето. Това се изпълнява по следния начин: index = re.search(r"6210\B", zones).

Сега, когато index съдържа обект от търсене, е време да извлечем данни от него, използвайки span(). Създайте променлива с име vector и запазете местоположението на обекта от търсенето, както следва: vector = index.span(). След като бъде настроено, използвайте променливата vector с предварително написаната функция write().

След това ще работим върху идентифицирането на елементите от зоните. Отидете до тъмния X знак върху зеления килим. Създайте списък с име sectors и използвайте функцията re.split(), за да обедините всички различни секторни зони в списък. В функцията split използвайте специалната последователност "\D", за да вземете само числата от променливата zones. Използвайте списъчно включване (list comprehension), за да премахнете празните места от списъка, използвайки функцията len(), за да премахнете елементи, които са твърде малки, за да бъдат номер на сектор. Например така:

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

Използвайте zones с функцията write(), за да оформите всички секторни зони.

Отидете до светлия X знак до лилавия килим и се обърнете към шкафчето за документи, използвайте функцията read(), за да проверите приоритетните зони в разделението на земята. Запомнете секторите, тъй като трябва да проверим дали тези сектори се намират в списъка със зони.

Отидете до тъмния X знак върху лилавия килим, където има три (3) приоритетни зони в променливи с имена: sector_a, sector_b, sector_c, предварително написани в редактора на кода. Въведете стойностите, които прочетохте от светлия X знак. Тези променливи използват списъчно включване, което преминава през всички елементи в списъка sectors и ги филтрира чрез функцията re.match(). Използвайте променливите sector_a, sector_b, sector_c и ги въведете в предварително написаната функция write(), за да завършите нивото.

Книга с Код