正则表达式以获取不同的匹配项

时间:2020-08-05 23:33:27

标签: regex regexp-replace

这是我的输出:

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

我需要一个正则表达式来匹配以下值:

正则表达式1:仅获得第一个匹配项,如下所示

 Drop Flow: FALSE (UNDER CASE1)

regex 2:仅获得第二个匹配项,如下所示:

 Drop Flow: TRUE (UNDER CASE2)

我拥有的正则表达式是:

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

但这给出了所有3个匹配项(案例1,案例2和案例3)。如何获得个人比赛?

预先感谢

2 个答案:

答案 0 :(得分:1)

按照建议尝试:

(CASE \d+)(?:(?!CASE \d+)[\s\S])*(Drop Flow: (?:TRUE|FALSE))
  • 模式开始使用CASE \d+搜索头锚并将其放入$1
  • 使用所有不包含字符串(?:(?!CASE \d+)[\s\S])*的内容,以避免从另一个CASE中获取Drop Flow值,
  • 最后,搜索末尾锚点(Drop Flow: (?:TRUE|FALSE)),并将其放入$2

DEMO

沿着这条线的一些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)))

答案 1 :(得分:0)

如果只希望前2个匹配而不是第三个匹配,则可以添加正向前行(?=\s*\r?\n\S),该行断言应该在后面跟随以非空白字符\S开始的行< / p>

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

Regex demo

另一种选择是捕获组1中的值和组2中的TRUE FALSE部分,并确保以连字符开头的闭合线。

^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 demo