我的输入文本文件就像
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代码中使用此正则表达式。
答案 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
,此方法仅在字符串开头搜索匹配项,因此,无需添加^
锚点(与字符串开头匹配)。