Coding for KidsCoding for Kids
Творческие УровниИспытанияРуководство для Учителей
Голосовать за функции
Продвинутый курс разработки на 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. Эти переменные используют list comprehension, который проходит по всем элементам списка sectors и фильтрует их с помощью функции re.match(). Используйте переменные sector_a, sector_b, sector_c и вставьте их в заранее написанную функцию write(), чтобы завершить уровень.

Книга Кода