【问题标题】:Regex groups in pythonpython中的正则表达式组
【发布时间】:2026-01-06 20:00:02
【问题描述】:

我正在尝试使用正则表达式来识别以下格式的数据: 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"

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

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

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

编辑:[0-9]{0,2} 的日子部分,只是尝试一些方法来解决这个问题。

【问题讨论】:

标签: python regex


【解决方案1】:

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

(?:(?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

【讨论】:

  • 括号不平衡。
  • 那么我要访问第 1 2 3 组中的结果吗?
  • @AjayNair 与您所拥有的方式类似,只是您使用捕获的名称作为字符串。匹配对象与 .group('days') 代表天,.group('hrs') 代表小时,等等