我正在使用Python正则表达式来提取“2h30m”格式的持续时间。
我遇到一个问题,其中未捕获的组((?:...)
)被捕获到命名组中。
例如匹配2h30m
针对:
(?P<hours>\d+(?:h))?(?P<minutes>\d+(?:m))?
将匹配
{'hours': '2h', 'minutes': '30m'}
,而不匹配2
和30
。解决方法是使用肯定的先行断言(
(?=...)
),但这不会更新正则表达式FSM的状态,因此我们必须重复h
和m
后缀:(?P<hours>\d+(?=h))?h?(?P<minutes>\d+(?=m))?m?
有一个更好的方法吗?
最佳答案
非捕获组不会“反捕获”它们匹配的内容并将其从外部组中删除。它们只是将事物组合在一起的一种方式,因此您可以对它们应用量词。
为了获得想要的效果,您可以重新排列组以将非捕获组置于捕获组之外:
(?:(?P<hours>\d+)h)?(?:(?P<minutes>\d+)m)?