捕获组内部的非捕获组

7
我正在使用Python正则表达式来提取“2h30m”格式的时间持续时间。 我遇到了一个问题,非捕获组((?:...))被捕获在命名组内。 例如,将2h30m与以下内容匹配:
(?P<hours>\d+(?:h))?(?P<minutes>\d+(?:m))?

匹配字符串应该是{'hours': '2h', 'minutes': '30m'},而不是230

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

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

有没有更好的方法来做这件事呢?

“h”和“m”真的是可选的吗?能够匹配未锚定空字符串的正则表达式是一种不好的做法。 - Wiktor Stribiżew
非捕获组不会“反捕获”其匹配内容并将其从外部组中删除;它们只是一种将内容分组以便对其应用量词的方式。 - user2357112
@stribizhev:正则表达式应该匹配'5h','5m'和'5h5m'。 - megapctr
1个回答

17

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

要获得所需的效果,您可以重新排列组,将非捕获组放在捕获组外面:

Non-capturing groups不会“反捕获”它们匹配的内容并将其从外部组中删除。它们只是一种将事物分组在一起以便可以对其应用量词的方式。

要获得所需的效果,您可以重新排列组,将非捕获组放在捕获组外面:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接