Пример входных данных и ожидаемых выходных данных:
- "2025-01-01" → Верно (Присутствуют все компоненты)
- "31 января 2026 г." → Верно (Формат естественного языка со всеми компоненты)
- "Январь 2026" → False (не указан день)
- "2026" → False (не указан месяц и день)
"2025-01" -> Ложь
Сейчас я использую dateutil.parser.parse для анализа строки даты, а затем проверки допустимости атрибутов года, месяца и дня в результирующем объекте datetime. Однако функция синтаксического анализа заполняет недостающие компоненты значениями по умолчанию, что затрудняет определение того, были ли эти компоненты явно указаны во входной строке. Итак, я написал приведенную ниже логику, чтобы обойти эту проблему.
Код: Выделить всё
def parse_date(date_string):
try:
default_dt1 = datetime(1,1,1)
default_dt2 = datetime(2,2,2)
parsed_date1 = dateutil.parser.parse(date_string,default=default_dt1)
parsed_date2 = dateutil.parser.parse(date_string,default=default_dt2)
if parsed_date1 == parsed_date2:
# print(parsed_date1.month)
return True
return False
except (ValueError,TypeError):
return False
Даты по умолчанию:
Функция использует две даты по умолчанию: datetime(1, 1, 1) и datetime(2, 2, 2), чтобы заполнить недостающие компоненты при анализе входной строки даты.
Разбор:
Он анализирует строку date_string дважды, используя parser.parse (из модуля dateutil.parser) с двумя разными датами по умолчанию.
Если в строке date_string отсутствуют компоненты (например, день или месяц), синтаксический анализатор .parse будет использовать значения по умолчанию для заполнения пробелов.
Сравнение:
Если оба проанализированных результата одинаковы, это означает, что строка date_string имеет все компоненты, как недостающие компонентов приведет к различиям в двух проанализированных датах из-за разных значений по умолчанию.
Вопрос:
Как я могу надежно проверить, содержит ли строка даты явно все три компоненты, не полагаясь на значения по умолчанию, добавленные dateutil? Есть ли лучший способ добиться этого? Я попытался указать значения по умолчанию как «Нет», но это не работает. к моему удивлению, для этого не существует функции по умолчанию.
Примечание: формат ввода не является единообразным.
Подробнее здесь: https://stackoverflow.com/questions/793 ... -day-month