有个项目,使用自定义的表达式来表达时间长度,比如 1d 代表一天 , 3m2d4h8min299s 代表三个月两天四小时八分钟二百九十九秒。
现在考虑使用正则表达式来做格式的解析,
正则如下,使用命名分组方便取值。
'(?P<year>\d+(?=y))?(?P<month>\d+(?=m))?(?P<day>\d+(?=d))?(?P<hour>\d+(?=h))?(?P<minute>\d+(?=min))?(?P<second>\d+(?=s))?'
但是在测试的时候, 用 3d8s
做测试,
使用 re.match(regx, '3d8s').groupdict() 得到的结果是 {'hour': None, 'month': None, 'second': None, 'year': None, 'day': '3', 'minute': None}
用 re.findall(regx,'3d8s') 得到的是个列表,[('', '', '3', '', '', ''), ('', '', '', '', '', ''), ('', '', '', '', '', '8'), ('', '', '', '', '', ''), ('', '', '', '', '', '')]
这是因为什么?正确的做法是怎样的?
(?=...)
是不消耗这个字符的,而你应该消耗掉它。m = re.match('((?P<year>\d+)y)?((?P<month>\d+)m(?!in))?((?P<day>\d+)d)?((?P<hour>\d+)h)?((?P<minute>\d+)min)?((?P<second>\d+)s)?', '8d3s')
谢楼下的m和min,再打补丁。