我正在尝试使用可选的捕获组来构建python正则表达式。我的正则表达式适用于大多数情况,但是无法将其中的一项匹配放在一个测试用例中。
我要匹配并捕获以下情况:
命名空间:: tool_name :: 1.0.1
命名空间:: tool_name
工具名称:: 1.0.1
工具名称
这是我到目前为止使用的正则表达式:
(?:(?P<namespace>^[^:]+)::)?(?P<name>[^:]*)(?:::(?P<version>[0-9\.]+))?
此正则表达式适用于我所有的4个测试用例,但我遇到的问题是情况3,在名称空间组中捕获了tool_name,在名称组中捕获了1.0.1。我希望它们分别在正确的组,名称和版本中被捕获
谢谢
答案 0 :(得分:3)
您可以通过将*
替换为+
(看起来总是存在)来使tool_name regex成为必需部分,并限制此模式以匹配三个以负号分隔的点分隔数字: / p>
^(?:(?P<namespace>[^:]+)::)?(?!\d+(?:\.\d+){2})(?P<name>[^:]+)(?:::(?P<version>\d+(?:\.\d+){2}))?
请参见regex demo
详细信息
^
-字符串的开头(?:(?P<namespace>[^:]+)::)?
-一个可选的非捕获组,将除:
之外的任意1个以上的字符匹配到“命名空间”组中,然后仅匹配::
(?!\d+(?:\.\d+){2})
-负前瞻,不允许digits.digits.digits
模式出现在当前位置之后(?P<name>[^:]+)
-组“名称”::
以外的1个或多个字符(?:::(?P<version>\d+(?:\.\d+){2}))?
-一个与::
匹配的可选非捕获组,然后“版本”组捕获1个以上的数字和2个.
和1个以上的重复数字。