我如何使用"而不是"正确识别项目不在Python的字符串列表中?

时间:2016-01-05 16:16:37

标签: python list tuples

我有一个由接口名称和访问列表名称组成的元组列表。像这样: exempt_int_acl_tuple=[('(app)', 'access-list nonat'), ('(app2)', 'access-list nonat')]

要搜索的示例配置是这样的:

config=['access-list nonat extended permit ip 10.0.0.0 255.0.0.0 10.0.0.0 255.0.0.0','access-list nonat extended permit ip 10.0.0.0 255.0.0.0 192.168.15.0 255.255.255.0','access-list nonat extended permit ip 10.0.0.0 255.0.0.0 1.1.1.1 255.255.255.240','blah','blah blah','some more blah']

我有一个列表字符串,我在其中寻找特定的模式。如果列表与模式匹配,我将其添加到名为exempt_acl的新列表中。

所以我的代码看起来像这样:

exempt_acl=[]
for interface,acl_name in exempt_int_acl_tuple:
      for someline in config:
        acl_statement=acl_name+' extended permit ip '
        if (acl_statement in someline) and (someline not in exempt_acl):
          exempt_acl.append(someline)

在这种情况下,重复元组中的访问列表名称,以便搜索配置文件两次。所以exempt_acl看起来像这样:

['access-list nonat extended permit ip 10.0.0.0 255.0.0.0 10.0.0.0 255.0.0.0 ', 'access-list nonat extended permit ip 10.0.0.0 255.0.0.0 192.168.15.0 255.255.255.0 ', 'access-list nonat extended permit ip 10.0.0.0 255.0.0.0 1.1.1.1 255.255.255.240 ']
['access-list nonat extended permit ip 10.0.0.0 255.0.0.0 10.0.0.0 255.0.0.0 ', 'access-list nonat extended permit ip 10.0.0.0 255.0.0.0 192.168.15.0 255.255.255.0 ', 'access-list nonat extended permit ip 10.0.0.0 255.0.0.0 1.1.1.1 255.255.255.240 ']

然而,相同的行被添加两次,并且它创建了一个列表列表,而不是字符串列表。我认为(someline not in exempt_acl)的布尔值评估会阻止第二次添加行,但确实如此。我究竟做错了什么?我正在使用file.read().splitlines()来读取配置文件,以防万一。

3 个答案:

答案 0 :(得分:1)

假设您有一个名为config.txt的文件,其中包含以下内容:

access-list nonat extended permit ip 10.0.0.0 255.0.0.0 10.0.0.0 255.0.0.0
access-list nonat extended permit ip 10.0.0.0 255.0.0.0 192.168.15.0 255.255.255.0
access-list nonat extended permit ip 10.0.0.0 255.0.0.0 1.1.1.1 255.255.255.240

test.py包含此内容:

exempt_acl = [('(app)', 'access-list nonat'),
              ('(app2)', 'access-list nonat'),
             ]

results = []
with open('config.txt') as config:
    for line in config:
        line = line.strip()
        for _,acl_name in exempt_acl:
            acl_statement = acl_name + ' extended permit ip '
            if line.startswith(acl_statement) and line not in results:
                results.append(line)

for result in results:
    print(result)

如果我理解你的问题,那应该做你正在寻找的事情。

我不确定您在原始代码库中的确切行为 - 您问题中的代码绝对不是MCVE。此代码也按预期工作:

config = [line.strip() for line in open('config.txt')]

results = []
for _, acl_name in exempt_acl:
    for line in config:
        acl_statement = acl_name + ' extended permit ip '
        if acl_statement in line and line not in results:
            results.append(line)

for result in results:
    print(result)

答案 1 :(得分:1)

首先,list ify somelinesomeline = someline[0]

如果行似乎仍然附加两次,则可能归结为条件if (acl_statement in someline)的模糊性。如果两行略有不同(例如,不同数量的空白),但包含相同的acl_statement,则两者都将被追加。

答案 2 :(得分:0)

我找到了为什么配置打印两次的答案。

Main正在调用该函数两次。一旦错误(不将函数输出映射到值,但执行调试中涉及的打印),并且一次正确,因此不会影响输出。

感谢所有协助的人。我非常感谢你的帮助,我也学到了一些东西!对我来说最重要的一课是在将来发布之前制定MCVE。