正则表达式条件监视

时间:2019-05-30 11:27:33

标签: regex regex-lookarounds

我的输入文本文件就像

A={5,6},B={2},C={3}
B={2,4}
A={5},B={1},C={3}
A={5},B={2},C={3,4,QWERT},D={TXT}

我想匹配A = 5,B = 2和C = 3的所有行。要注意的是,如果未提及变量,则该变量可以取任何值,因此该行也需要匹配。

上方应匹配第1,2和4行。

我尝试过

.*?(?:(?=A)A\{.*?5).*?(?:(?=B)B\{.*?2).*?(?:(?=C)C\{.*?3)

https://regex101.com/r/NN9qk5/1

但是,它不起作用

我将在python 3.6代码中使用此正则表达式。

1 个答案:

答案 0 :(得分:1)

如果您想使用正则表达式来解决它,则可以使用

^
 (?!.*\bA={(?![^{}]*\b5\b))
 (?!.*\bB={(?![^{}]*\b2\b))
 (?!.*\bC={(?![^{}]*\b3\b))
.*

请参见regex demo

关键是如果括号内没有包含给定数字值的键,则匹配失败。

例如(?!.*\bA={(?![^{}]*\b5\b))是一个否定的超前查询,如果在当前位置的右侧,如果没有匹配项,则匹配失败  -.*-除换行符以外的任何0+个字符  -\bA-整个词A  -={-={子字符串  -(?![^{}]*\b5\b)-除了{}之外,后面没有任何0+个字符,然后整个单词后面跟着5

Sample usage在Python 3.6中:

import re
s = """A={5,6},B={2},C={3}
B={2,4}
A={5},B={1},C={3}
A={5},B={2},C={3,4,QWERT},D={TXT}"""
given = { 'A': '5', 'B': '2', 'C': '3'}

reg_pattern = ''
for key,val in given.items():
    reg_pattern += r"(?!.*\b{}={{(?![^{{}}]*\b{}\b))".format(key,val)

reg = re.compile(reg_pattern)

for line in s.splitlines():
    if reg.match(line):
        print(line)

输出:

A={5,6},B={2},C={3}
B={2,4}
A={5},B={2},C={3,4,QWERT},D={TXT}

请注意使用re.match,此方法仅在字符串开头搜索匹配项,因此,无需添加^锚点(与字符串开头匹配)。