Python функция для разделения строки продолжительности - PullRequest
0 голосов
/ 28 апреля 2020

все! Я создаю бот Discord, и с помощью команды ban, я найду способ забанить кого-то на указанное время. Длительность строки будет go до суток. Полная строка может выглядеть примерно так:
1d / 5h30m / 14d / 10m
Я ищу способ разобрать эти строки и получить что-то вроде {"minutes": 10, "hours": 5}
Это не должен быть словарь, просто что-то, где я могу сказать, какая это единица времени, и умножить его, чтобы узнать, как долго должен длиться бан. Любые идеи приветствуются!

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Я нашел этот пакет с именем длительности (который можно установить с pip), и он делает именно то, что вам нужно. (не путайте это с duration).

Из их примеров readme:

>>> from durations import Duration

>>> one_hour = '1hour'

>>> one_hour_duration = Duration(one_hour)
>>> one_hour_duration.to_seconds()
3600.0
>>> one_hour_duration.to_minutes()
60.0


# You can even compose durations in their short
# and long variations
>>> two_days_three_hours = '2 days, 3h'
>>> two_days_three_hours_duration = Duration(two_days_three_hours)
>>> two_days_three_hours_duration.to_seconds()
183600.0
>>> two_days_three_hours_duration.to_hours()
51.0
1 голос
/ 28 апреля 2020

Вы можете использовать регулярные выражения для анализа строки времени и использовать datetime для преобразования в желаемую единицу измерения, например, секунды:

import re, datetime

test_str = '0d20h30m'

conv_dict = {
    'd': 'days',
    'h': 'hours',
    'm': 'minutes',
    's': 'seconds',
}

pat = r'[0-9]+[s|m|h|d]{1}'
def timestr_to_dict(tstr):
  'e.g. convert 1d2h3m4s to {"d": 1, "h": 2, "m": 3, "s": 4}'
  return {conv_dict[p[-1]]: int(p[:-1]) for p in re.findall(pat, test_str)}

print(timestr_to_dict(test_str))
{'days': 0, 'hours': 20, 'minutes': 30}

def timestr_to_seconds(tstr):
  return datetime.timedelta(**timestr_to_dict(tstr)).total_seconds()

print(timestr_to_seconds(test_str))
# 73800.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...