为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2021-11-23 19:19:08
我正在尝试构建一个带有可选捕获组的 python 正则表达式。我的正则表达式适用于大多数情况,但未能将匹配项放在测试用例之一中的正确组中。我想匹配和捕获以下情况:命名空间::工具名称::1.0.1命名空间::工具名称工具名称::1.0.1工具名称这是我到目前为止的正则表达式:(?:(?P<namespace>^[^:]+)::)?(?P<name>[^:]*)(?:::(?P<version>[0-9\.]+))?这个正则表达式适用于我所有的 4 个测试用例,但我遇到的问题是在案例 3 中,tool_name 在命名空间组中被捕获,而 1.0.1 在名称组中被捕获。我希望它们分别被捕获在正确的组、名称和版本中谢谢
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您可以通过替换*with +(它看起来总是存在)来使 tool_name regex 部分成为强制性的,并限制此模式匹配三个点分隔的数字块,并具有负前瞻:

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

查看正则表达式演示

细节

  • ^ - 字符串的开始

  • (?:(?P<namespace>[^:]+)::)?- 一个可选的非捕获组匹配除:“命名空间”组之外的任何 1+ 个字符,然后只匹配::

  • (?!\d+(?:\.\d+){2})- 不允许digits.digits.digits模式出现在当前位置之后的负前瞻

  • (?P<name>[^:]+) - 组“名称”:除此之外的任何 1 个或多个字符 :

  • (?:::(?P<version>\d+(?:\.\d+){2}))?- 可选的非捕获组匹配::,然后组“版本”捕获 1+ 位数字和 1+ 位数字的 2 次重复.


查看完整回答
反对 回复 2021-11-23
  • 1 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信