我正在尝试使用正则表达式来识别格式的数据: 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"
对于上述情况,它失败了。
我知道我可以使用trys和excepts来完成它,但我希望找到一种简洁而有效的方法。
任何输入都会非常有用。很高兴对我的询问作出任何进一步的澄清。
编辑:[0-9]{0,2}
日期部分,只是尝试了几种方法来解决这个问题。
答案 0 :(得分:2)
您可以使用正则表达式:
(?:(?P<days>[0-9]{0,2})\s*day[^, ]*,? *)?(?:(?P<hrs>[0-9]+)\s*hour[^, ]*,? *)?(?:(?P<min>[0-9]+)\s*minute[^, ]*,? *)?
我正在使用[^, ]*,? *
作为可选的逗号和空格而不使用.*
,因此没有太多的回溯。
我还使用了命名捕获组,并将每天/小时/分钟的整个组包装到非捕获组中,之后我将?
标记为可选。每组都非常相似:
(?: # 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