Улучшение таймера регулярных выражений Python

#python #regex #discord.py

#python #регулярное выражение #discord.py

Вопрос:

Итак, это мой текущий код для таймера в моем discord.py бот..

 #Timer (Need to option for s,m,h and exit)
@client.command()
async def timer(ctx, seconds):
    try:
       text = (seconds)
       in_seconds = {'h': 60 * 60, 'm': 60, 's': 1}
       seconds = sum(int(num) * in_seconds[weight] for num, weight in re.findall(r'(d )s?(m|s|h)', text))
       if seconds > 86400:
            await ctx.send("I don't think I want you to go over 24h right now")
            raise BaseException
       if seconds < 0:
            await ctx.send("I don't think you want to do negatives")
            raise BaseException
       message = await ctx.send(f"Timer: {seconds}")
       while True:
            seconds -= 5
            if seconds < 0:
                await message.edit(content="Ended!")
                break
            await message.edit(content=f"Timer: {seconds}")
            await asyncio.sleep(5)
       await ctx.send(f"{ctx.author.mention}, Your countdown has ended!")
    except ValueError:
        await ctx.send('You must enter a number!')
  

Итак, это отлично работает, когда я делаю таймер 10 секунд или таймер 5 минут, но когда я делаю таймер 10, он автоматически не принимает его за секунды и немедленно завершает таймер.. Как мне это исправить, пожалуйста, помогите мне

Ответ №1:

Для вашего регулярного выражения требуется m , s или h :

 (d )s?(m|s|h)
  

Измените его, чтобы также ничего не разрешать:

 (d )s?(m|s|h)?
  

а затем убедитесь, что weight используется или по умолчанию используется s :

 weight if weight else 's'
  

Склейте это вместе:

 seconds = sum(int(num) * in_seconds[weight if weight else 's'] for num, weight in re.findall(r'(d )s?(m|s|h)?', text))
  

Комментарии:

1. Большое спасибо.. Это было действительно полезно. Также, если вы знаете discord.py не могли бы вы сказать мне, как я мог бы добавить такую функцию, как?? завершите работу, чтобы остановить таймер на полпути

Ответ №2:

Я думаю, проблема в самом регулярном выражении:

 (d )s?(m|s|h)
  

Обратите внимание, что токен (m|s|h) является обязательным. Ваше регулярное выражение не будет соответствовать, если в строке нет m, s или h . Мы можем обойти это, сделав это необязательным следующим образом:

 (d )s?(m|s|h)?