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