0

我正在尝试使用正则表达式来识别格式的数据:XX 天、XX 小时、XX 分钟(预计由于空格、逗号和复数而导致的结构变化最小)我想看到一种使用正则表达式的有效 python 方式,以便我可以获取与天小时和分钟相关的数字。

我尝试了以下方法:

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"

对于上述情况,它失败了。

我知道我可以使用尝试和例外来完成它,但我希望找到一种简洁有效的方法。

任何输入都会非常有帮助。很高兴对我的查询提供任何进一步的澄清。

编辑:[0-9]{0,2}对于这几天,只是尝试一些方法来解决这个问题。

4

1 回答 1

2

您也许可以使用如下正则表达式:

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

正则表达式101演示

我正在使用[^, ]*,? *可选的逗号和空格,而不是.*仅仅为了没有太多的回溯。

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

(?:                       # 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
于 2013-10-08T16:34:11.610 回答