Разбор понятных для человека повторяющихся дат в Python

Проблема. В моем приложении Django пользователи создают задачи для запланированного выполнения. Пользователи совершенно нетехнические, и было бы здорово, если бы они могли писать обычные человеко-читаемые выражения, чтобы определить, когда выполнять определенную задачу, например:

  • каждый понедельник
  • каждый пт
  • ежедневно
  • 1, 14, 20 каждого месяца
  • каждый пт; каждый конец месяца

Это вдохновляет Тодоист . Пока нужны только даты; нет времени. Я потратил пару часов на поиск в библиотеке, чтобы сделать это, но не повезло. Я ожидаю функцию, скажем, in_range(expression, date) , такую, что:

 >>> in_range('every monday, wednesday', date(2014, 4, 28)) True >>> in_range('every end of month', date(2014, 5, 12)) False >>> in_range('every millenium', date(2014, 5, 8)) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: unknown token "millenium". 

Варианты. Это то, что я просмотрел.

  • Стандартная библиотека даты и времени выполняет синтаксический анализ даты, но не синтаксис диапазона дат в соответствии с приведенным выше.
  • Python-dateutil – поддерживает повторяющиеся даты через rrule , очень функциональный, но все же не поддерживает синтаксический анализ.
  • Python-crontab и Python-croniter принимают стандартный синтаксис Unix crontab (и позволяют указывать дни недели и т. Д.), Но все же такой синтаксис является слишком техническим, и я хотел бы избежать его, если это возможно.
  • Arrow и Parsedatetime не поддерживают эту функцию.

Итак, есть ли фрагмент кода на Python или библиотека, которую я пропустил, чтобы сделать что-то? Если нет, я сам напишу синтаксический анализатор. Хотелось бы опубликовать его в open source, если это не так уж плохо.

Recurrent – это библиотека, которая будет выполнять партирование даты на естественном языке с поддержкой повторяющихся дат. Он не соответствует предоставленному вами API, но позволяет создавать правила, которые можно использовать с библиотекой datetime Python.

Со своей страницы Github:

Анализ языка на разных языках и повторяющиеся события

Примеры

Время

  • Следующий вторник
  • завтра
  • через час

Повторяющиеся события

  • на выходных
  • каждую четверть месяца с 1 января 2010 года по 25 декабря 2020 года
  • каждый до следующего месяца
  • раз в год в четвертый четверг ноября
  • вторник и четверг в 3:15

Беспощадные строки

  • Запланируйте встречу на каждый второй вторник в полдень
  • Установите будильник для следующего вторника в 11:00