python中的正则表达式组

2024-05-05 19:18:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用regex来标识以下格式的数据: XX天,XX小时,XX分钟(由于空格、逗号和复数,结构变化最小) 我希望看到一种高效的python方法来使用regex,这样我就可以得到与日、小时和分钟相关的数字。你知道吗

我尝试了以下方法:

matchingTime = "27 days, 21 hours, 23 minutes ago"
re.search('([0-9]{0,2}).*day.* ([0-9]+) .*hour.* ([0-9]+) .*minute.*',matchingTime)

对于上面的例子,它工作得很好,我分别得到了第1组、第2组和第3组的值。你知道吗

问题是,这两个领域中的任何一个都不一定存在

matchingTime = "21 hours, 23 minutes ago"

对于上述情况,它失败了。你知道吗

我知道我可以用try和excepts来完成它,但我希望找到一种简洁有效的方法。你知道吗

任何输入都会非常有用。很高兴对我的问题作进一步澄清。你知道吗

编辑:[0-9]{0,2}对于days部分,只是尝试一些方法来解决这个问题。你知道吗


Tags: 数据方法格式agodays标识regex复数
1条回答
网友
1楼 · 发布于 2024-05-05 19:18:42

您可以使用正则表达式,例如:

(?:(?P<days>[0-9]{0,2})\s*day[^, ]*,? *)?(?:(?P<hrs>[0-9]+)\s*hour[^, ]*,? *)?(?:(?P<min>[0-9]+)\s*minute[^, ]*,? *)?

regex101 demo

我使用[^, ]*,? *作为可选的逗号和空格,而不是使用.*,这样就不会有太多回溯。你知道吗

我还使用了命名的捕获组,并将每天/小时/分钟的整个组包装到一个非捕获组中,然后我将?标记为可选。每一组都相当相似:

(?:                       # Start of non-capture group
    (?P<days>[0-9]{0,2})  # Numbers to capture
    \s*                   # Spaces if any
    day                   # Literal match
    [^, ]*,? *            # Anything until first comma and optional spaces
)?                        # Close of non-capture group and marking it as optional

相关问题 更多 >