регулярное выражение, чтобы получить разные совпадения - PullRequest
1 голос
/ 06 августа 2020

Это мой результат:

CASE 1:
---------------------------------- 
Drop Pack: FALSE 
Drop Flow: FALSE 
---------------------------------- 
CASE 2:
---------------------------------- 
Drop Flow: TRUE 
Fail Open: FALSE 
Fail Close: FALSE 
---------------------------------- 
CASE 3:
---------------------------------- 
Drop Flow: FALSE 

Мне нужно регулярное выражение для соответствия значениям, как показано ниже:

regex 1: чтобы получить только первое совпадение, как показано ниже

 Drop Flow: FALSE (UNDER CASE1)

регулярное выражение 2: чтобы получить только второе совпадение, как показано ниже:

 Drop Flow: TRUE (UNDER CASE2)

У меня есть регулярное выражение:

Drop Flows:\s+([A-Z]+)

Но это дает все 3 совпадения (случай 1, case2 и case3). Как я могу получить индивидуальные совпадения?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Попробуйте, как предложено:

(CASE \d+)(?:(?!CASE \d+)[\s\S])*(Drop Flow: (?:TRUE|FALSE))
  • Шаблон начинает поиск якоря головы с помощью CASE \d+ и помещает его в $1,
  • потребляет все, что не содержать эту самую строку (?:(?!CASE \d+)[\s\S])*, чтобы избежать захвата значения Drop Flow из другого CASE,
  • и, наконец, ищет конечный якорь (Drop Flow: (?:TRUE|FALSE)) и помещает его в $2.

ДЕМО

Некоторый Python код в этих строках:

import re
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1
        print ("Group {groupNum}: {group}".format(groupNum = groupNum, group = match.group(groupNum)))
0 голосов
/ 06 августа 2020

Если вам нужны только первые 2 совпадения, а не третье, вы можете добавить положительный просмотр вперед (?=\s*\r?\n\S), который утверждает, что должна быть следующая строка, которая начинается с непробельного символа \S

Drop Flow:\s+([A-Z]+)(?=\s*\r?\n\S)

Regex demo

Другой вариант - захватить значение в группе 1 и часть TRUE FALSE в группе 2 и убедиться, что есть закрывающая строка, которая начинается с дефиса .

^CASE \d+:\r?\n-+[^\S\r\n]*(?:\r?\n(?!Drop Flow:).*)*\r?\n(Drop Flow: (TRUE|FALSE))[^\S\r\n]*(?:\r?\n(?!-).*)*\r?\n-

Демо Regex

...