为什么我的正则表达式中的可选捕获组不起作用?

Why my optional captured group in my regex does not work?

这是我通常会得到的文本示例:

CERTIFICATION/repos_1/test_examples_1_01_C.py::test_case[6]

CERTIFICATION/repos_1/test_examples_2_01_C.py::test_case[7]

INTEGRATION/test_example_scan_1.py::test_case

INTEGRATION/test_example_scan_2.py::test_case

这是我用来捕获 3 个不同组的正则表达式:

^.*\/(.*)\.py.*:{2}(.*(\[.*\])?)

如果我们以我的示例的第一行为例,我应该得到:

test_examples_1_BV_01_C - test_case[6] - [6]

最后一行:

test_example_scan_2 - test_case - None

但是如果您尝试使用此正则表达式,您会发现第一个示例不起作用。我不能得到 [6]。如果删除“?”您将无法匹配末尾没有“[.*]”的行

那么,我怎样才能获得所有这些信息呢?我做错了什么?

此致

您可以使用

^.*\/(.*)\.py.*::(.*?(\[.*?\])?)$

regex demo

详情:

  • ^ - 字符串开头
  • .* - 除换行字符外的任何零个或多个字符,尽可能多
  • \/ - 一个 / 字符
  • (.*) - 第 1 组:除换行字符外的任何零个或多个字符,尽可能多
  • \.py - .py 子字符串
  • .* - 除换行字符外的任何零个或多个字符,尽可能多
  • :: - :: 字符串
  • (.*?(\[.*?\])?) - 第 2 组:除换行符以外的任何零个或多个字符,尽可能少,然后是可选的第 3 组匹配 [,除此之外的任何零个或多个字符换行字符,尽可能少,和一个 ]
  • $ - 字符串结尾。

在否定字符的帮助下 class 你可以获得所有匹配项并使这个正则表达式更有效 高效:

^.*/([^.]+)\.py::([^[]+(\[[^]]*]|))$

RegEx Demo