我正在使用pyLR1为自定义描述语言编写词法分析器规则,其中应包括时间文字,例如:
10h30m # meaning 10 hours + 30 minutes
5m30s # meaning 5 minutes + 30 seconds
10h20m15s # meaning 10 hours + 20 minutes + 15 seconds
15.6s # meaning 15.6 seconds
时、分、秒部分的规格顺序应固定为h
、m
、s
。为了详细说明这一点,我想要以下有效的组合hms
、hm
、h
、和(当然ms
,不同段之间有数字)。作为奖励,正则表达式应该检查段中的十进制(即非自然)数字,并且只允许这些在最不重要的段中。m
s
因此,除了最后一组之外,我都有一个数字匹配,例如:
([0-9]+)
最后一组甚至:
([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?) # to allow for .5 and 0.5 and 5.0 and 5
浏览 h、m 和 sa 可爱的小 Python 脚本的所有组合给了我以下正则表达式:
(([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)h|([0-9]+)h([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)m|([0-9]+)h([0-9]+)m([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)s|([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)m|([0-9]+)m([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)s|([0-9]*\.[0-9]+|[0-9]+(\.[0-9]*)?)s)
显然,这是有点恐怖的表情。有没有办法简化这个?答案必须与 pythons模块一起使用,如果由于正则表达式的受限子集,re
我也将接受无法使用的答案。pyLR1