Шаг 82.
Однострочники Python. Регулярные выражения. Проверка формата времени во вводимых пользователем данных, часть 2

    На этом шаге мы усовершенствуем однострочник из предыдущего шага.

    На этом шаге мы еще больше углубимся в вопросы проверки формата времени во вводимых пользователями данных, чтобы решить проблему, упомянутую на предыдущем шаге: некорректные данные, введенные пользователем, например 99:99 не должны считаться допустимыми при поиске соответствий.

Общее описание

    Одна из удобных стратегий решения задач - иерархическая. Для начала сведите задачу к простейшему виду и решите этот более простой ее вариант. Далее уточните решение, чтобы оно соответствовало конкретной (и более сложной) задаче, стоящей перед вами. На данном шаге мы существенно совершенствуем решение из предыдущего шага: исключаем некорректные варианты вводимого времени наподобие 99:99 или 28:66. Поэтому наша задача становится более конкретной (и сложной), но мы можем повторно использовать отдельные части нашего старого решения.

Код

    Наша задача - написать функцию input_ok, принимающую строковый аргумент и проверяющий его на соответствие формату (времени) XX:XX, где X - число от 0 до 9 (пример 5.7). Кроме того, должен соблюдаться правильный формат времени во входных данных - в 24-часовом диапазоне от 00:00 до 23:59.


Пример 5.7. Однострочное решение для проверки соблюдения общего формата времени XX:XX и 24-часового диапазона во введенных пользователем данных.
## Зависимости
import re

## Данные
inputs = ['18:29', '23:55', '123', 'ab:de', '18:299', '99:99']

## Однострочник
input_ok = lambda x: re.fullmatch('([01][0-9]|2[0-3]):[0-5][0-9]', x) != None

## Результат
for x in inputs:
    print(input_ok(x))
Архив с файлом можно взять здесь.

    Этот код выводит шесть строк. Каких?

Принцип работы

    Как уже упоминалось в начале этого шага, мы можем повторно использовать части предыдущего однострочника для упрощения решения нашей задачи. Код остается тем же самым, меняется только регулярное выражение: ([01][0-9]|2[0-3]):[0-5][0-9]. Первая часть ([01] [0-9]|2[0-3]) представляет собой группу, которой соответствуют все возможные часы в сутках. Оператор логического ИЛИ | здесь позволяет учесть часы от 00 до 19, с одной стороны, и от 20 до 23 - с другой. Второй части, [0-5][0-9], соответствуют минуты от 00 до 59. В результате выводится следующее:

## Результат
for x in inputs:
    print(input_ok(x))

# True
# True
# False
# False
# False
# False

    Обратите внимание, что шестая из строк результата демонстрирует: время 99:99 более не считается допустимыми входными данными. Этот однострочник показывает, как с помощью регулярных выражений проверять соответствие вводимых пользователем данных семантическим требованиям приложения.

    На следующем шаге мы рассмотрим поиск удвоенных символов в строковых значениях.




Предыдущий шаг Содержание Следующий шаг