正则表达式将匹配项存储在错误的捕获组中

时间:2019-03-01 21:53:53

标签: python regex

我正在尝试使用可选的捕获组来构建python正则表达式。我的正则表达式适用于大多数情况,但是无法将其中的一项匹配放在一个测试用例中。

我要匹配并捕获以下情况:

  1. 命名空间:: tool_name :: 1.0.1

  2. 命名空间:: tool_name

  3. 工具名称:: 1.0.1

  4. 工具名称

这是我到目前为止使用的正则表达式:

(?:(?P<namespace>^[^:]+)::)?(?P<name>[^:]*)(?:::(?P<version>[0-9\.]+))?

此正则表达式适用于我所有的4个测试用例,但我遇到的问题是情况3,在名称空间组中捕获了tool_name,在名称组中捕获了1.0.1。我希望它们分别在正确的组,名称和版本中被捕获

谢谢

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个以上的重复数字。