Вот пример текста, который я обычно получаю:

СЕРТИФИКАЦИЯ / repos_1 / test_examples_1_01_C.py :: test_case [6]

СЕРТИФИКАЦИЯ / 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 - Нет

Но если вы попробуете это регулярное выражение, вы обнаружите, что первый пример не работает. Я не могу получить [6]. Если вы удалите "?" у вас не будет совпадений со строкой, в конце которой нет "[. *]"

Итак, как я могу получить всю эту информацию? А что делаю не так?

Отношении

1
CyDevos 27 Янв 2021 в 20:28

2 ответа

Лучший ответ

Ты можешь использовать

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

См. демонстрацию регулярного выражения

< EM> Подробнее :

  • ^ - начало строки
  • .* - любой ноль или более символов, кроме символов разрыва строки, как можно больше
  • \/ - символ /
  • (.*) - Группа 1: любой ноль или более символов, кроме символов разрыва строки, как можно больше
  • \.py - .py подстрока
  • .* - любой ноль или более символов, кроме символов разрыва строки, как можно больше
  • :: - строка ::
  • (.*?(\[.*?\])?) - Группа 2: любые ноль или более символов, кроме символов разрыва строки, как можно меньше, а затем необязательное соответствие Группы 3 [, любые ноль или более символов, кроме символов разрыва строки, как как можно меньше, и ]
  • $ - конец строки.
1
Wiktor Stribiżew 27 Янв 2021 в 17:33

С помощью инвертированного класса символов вы можете получить все совпадения и сделать это регулярное выражение более эффективным :

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

Демо RegEx

1
anubhava 27 Янв 2021 в 17:37
65924280