Поглиблений курс розробки на 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". Це робиться наступним чином: index = re.search(r"6210\B", zones).
Тепер, коли index містить об’єкт пошуку, настав час витягти з нього дані за допомогою функції span(). Створіть змінну vector і збережіть у неї координати об’єкта пошуку, наступним чином: vector = index.span(). Після цього використайте змінну vector з уже написаною функцією write().
Далі ми будемо визначати елементи зонування. Пройдіть до темного знаку X на зеленому килимі. Створіть список під назвою sectors і використайте функцію re.split() для об’єднання всіх різних секторів зонування в один список. Для функції split використайте спеціальну послідовність "\D", щоб отримати лише числа зі змінної zones. Використайте спискове включення, щоб прибрати порожні елементи зі списку, використовуючи функцію 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(), щоб завершити рівень.