Python 如何将字符串解析为毫秒?

Python 如何将字符串解析为毫秒?,python,Python,我一直在寻找关于StackOverflow的其他答案,但运气不好 我在discord.py中有一个静音命令,如下所示: @client.command() @commands.has_权限(kick_members=True) 异步def静音(ctx,成员:discord.member,时间:typing.Optional[str],*,reason=None): guild=ctx.guild 对于guild.roles中的角色: 如果role.name==“静音”: 等待成员。添加_角色(角

我一直在寻找关于StackOverflow的其他答案,但运气不好

我在discord.py中有一个静音命令,如下所示:

@client.command()
@commands.has_权限(kick_members=True)
异步def静音(ctx,成员:discord.member,时间:typing.Optional[str],*,reason=None):
guild=ctx.guild
对于guild.roles中的角色:
如果role.name==“静音”:
等待成员。添加_角色(角色)
wait ctx.send(“{}已被禁用,因为{}!”.format(member.username+“#”+member.discriminator,reason))
如何将时间参数转换为毫秒?类似于node.js中的
ms
模块


例如,我希望将
>mute@user 1h some reason
的持续时间解析为3600000毫秒。

我假设格式为
1h、1m和1s

我们从字符串中提取第三项(这不会执行错误检查以确保它有3项)

然后,我们评估是一小时、一分钟还是一秒:

if time_type == 'h':
    return value * 3600000
elif time_type == 'm':
    return value * 60000
else:
    return value * 1000
您可以将其展开以包括任何时间段(例如毫秒)。但是,它不执行任何错误检查。要再次检查给定命令是否适用于此,可以通过以下正则表达式运行它:

如果re.match(“(\S+\S+{2}\d+(h | m | S)。*”命令)不是无:
raw_time=command.split()[2]#假设命令“>mute@user 1h…”
value=int(原始时间[0:-1])#除最后一个字符外的所有字符
时间类型=原始时间[-1]#最后一个字符
如果时间类型='h':
返回值*3600000
elif time_type=='m':
返回值*60000
其他:
返回值*1000
其他:
# ...

Python具有内置模块
timedelta
,可以很好地实现这一点

如果字符串可以具有混合时间输入,如“1h”、“1h10m”或“1h20m30s”,则可以使用以下选项:

from datetime import timedelta
import re

def commandToMs(command):
    # Check for string of type 1h40m5s, any part optional, surrounding by whitespace.
    # Negative lookahead at beginning to prevent matching \s\s
    timeMatch = re.search(
        r"\s(?!\s)((?P<hrs>\d+)h)?((?P<mins>\d+)m)?((?P<secs>\d+)s)?\s", 
        command)  

    if not timeMatch:
        return 0

    timeDict = timeMatch.groupdict()

    # Convert empty matches from None to 0
    # keys() returns in arbitrary order. Sort to get "hrs", "mins", "secs"
    hrs, mins, secs = (
        int(timeDict[key]) if timeDict[key] else 0 for key in
        sorted(timeDict.keys())
    )
    delta = timedelta(hours=hrs, minutes=mins, seconds=secs)
    return delta.total_seconds() * 1000

commandToMs(">mute @user 1h some reason") # 3600000.0
从日期时间导入时间增量
进口稀土
def命令TOMS(命令):
#检查1h40m5s类型的字符串,任何可选部分,周围有空格。
#开始时为负前瞻,以防止匹配\s\s
timeMatch=重新搜索(
r“\s(?!\s)((?P\d+h)?(?P\d+m)?(?P\d+s)?\s”,
指挥部)
如果不是时间匹配:
返回0
timeDict=timeMatch.groupdict()
#将空匹配项从无转换为0
#keys()以任意顺序返回。排序以获得“小时”、“分钟”、“秒”
小时、分钟、秒=(
int(timeDict[key])如果timeDict[key]为0表示输入
已排序(timeDict.keys())
)
增量=时间增量(小时=小时,分钟=分钟,秒=秒)
返回增量总秒数()*1000
commandToMs(“>mute@user 1h某种原因”)#3600000.0

给您的命令是字符串还是列表?基本上,时间是一个字符串,其值类似于
1h
10m
,分别表示1小时和10分钟。我想将给定的时间解析为毫秒。你搜索的是什么,没有任何帮助?这是“简单的”(一旦你做了一两次)字符串处理;将字母部分和数字部分分开,并直接编程你需要的含义。寻找正则表达式来提取单词和片段,或者用
isnumeric
isalpha
编写一个暴力解决方案。这就足够了吗?
from datetime import timedelta
import re

def commandToMs(command):
    # Check for string of type 1h40m5s, any part optional, surrounding by whitespace.
    # Negative lookahead at beginning to prevent matching \s\s
    timeMatch = re.search(
        r"\s(?!\s)((?P<hrs>\d+)h)?((?P<mins>\d+)m)?((?P<secs>\d+)s)?\s", 
        command)  

    if not timeMatch:
        return 0

    timeDict = timeMatch.groupdict()

    # Convert empty matches from None to 0
    # keys() returns in arbitrary order. Sort to get "hrs", "mins", "secs"
    hrs, mins, secs = (
        int(timeDict[key]) if timeDict[key] else 0 for key in
        sorted(timeDict.keys())
    )
    delta = timedelta(hours=hrs, minutes=mins, seconds=secs)
    return delta.total_seconds() * 1000

commandToMs(">mute @user 1h some reason") # 3600000.0