命名组内的非捕获组

时间:2015-11-07 15:36:06

标签: python regex

我正在使用Python正则表达式以'2h30m'格式提取持续时间。 我遇到了一个问题,其中非捕获组((?:...))被捕获到命名组内。

e.g。匹配2h30m

(?P<hours>\d+(?:h))?(?P<minutes>\d+(?:m))?

将匹配{'hours': '2h', 'minutes': '30m'},而不是230

解决方法是使用正向前瞻断言((?=...)),但这不会更新正则表达式FSM的状态,因此我们必须重复hm后缀:

(?P<hours>\d+(?=h))?h?(?P<minutes>\d+(?=m))?m?

有更好的方法吗?

1 个答案:

答案 0 :(得分:11)

非捕获组不会“反捕获”它们匹配的内容并将其从外部组中删除。它们只是将事物分组在一起的一种方式,因此您可以将量词应用于它们。

要获得所需的效果,您可以重新排列组以将非捕获组置于捕获组之外:

(?:(?P<hours>\d+)h)?(?:(?P<minutes>\d+)m)?