这是我的输出:
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)。如何获得个人比赛?
预先感谢
答案 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
。沿着这条线的一些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)
另一种选择是捕获组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-