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

Python 在错误的捕获组中存储匹配项的正则表达式,python,regex,Python,Regex,我正在尝试构建一个带有可选捕获组的python正则表达式。我的正则表达式适用于大多数情况,但无法将匹配项放入其中一个测试用例的正确组中 我想匹配并捕获以下情况: 名称空间::工具名称::1.0.1 名称空间::工具名称 工具名称::1.0.1 工具名称 这是我到目前为止的正则表达式: (?:(?P<namespace>^[^:]+)::)?(?P<name>[^:]*)(?:::(?P<version>[0-9\.]+))? (?:(?P^[^:]+):)(

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

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

  • 名称空间::工具名称::1.0.1

  • 名称空间::工具名称

  • 工具名称::1.0.1

  • 工具名称

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

    (?:(?P<namespace>^[^:]+)::)?(?P<name>[^:]*)(?:::(?P<version>[0-9\.]+))?
    
    (?:(?P^[^:]+):)(?P[^:]*)(?::(?P[0-9\.]+))?
    
    这个正则表达式适用于我的4个测试用例,但问题是在用例3中,工具名称在名称空间组中被捕获,1.0.1在名称组中被捕获。我希望他们被捕获在正确的组,名称和版本分别


    谢谢

    您可以通过将
    *
    替换为
    +
    (它看起来总是存在)来强制使用工具名正则表达式部分,并限制此模式与三个点分隔的数字块进行匹配,并具有负前瞻性:

    ^(?:(?P<namespace>[^:]+)::)?(?!\d+(?:\.\d+){2})(?P<name>[^:]+)(?:::(?P<version>\d+(?:\.\d+){2}))?
    
    ^((?P[^:+)::)?(?!\d+(?:\。\d+){2})(?P[^:+)(?:::(?P\d+(?:\。\d+{2}))?
    

    详细信息

    • ^
      -字符串的开头
    • (?:(?P[^::+):)?
      -一个可选的非捕获组,将除
      以外的任何1+字符匹配到组“namespace”中,然后只匹配
    • (?!\d+(?:\。\d+{2})
      -一种不允许
      数字.digits.digits
      模式正好出现在当前位置之后的反向前瞻
    • (?P[^::]+)
      -组“名称”:除
    • (?:::(?P\d+(?:\.\d+{2}))?
      -可选的非捕获组匹配
      ,然后组“版本”捕获1+个数字和2个重复的
      和1+个数字

    只需将
    ^
    移出
    名称空间
    组,并将其放在模式的开头。