完全匹配字符串列表中的字符串

时间:2018-07-06 20:12:08

标签: python

我有一个要与之匹配的设备端口号的列表,但我不想重复,它需要完全匹配。

这是列表的一个示例:

port_list = ['port 1.1', 'port 1.2', 'port 1.3', 'port 1.4', 'port 1.5', 
'port 1.6', 'port 1.7', 'port 1.8', 'port 1.9', 'port 1.10','port 1.11', 
'port 1.12', 'port 1.13', 'port 1.14', 'port 1.15', 'port 1.16', 'port 1.17', 
'port 1.18', 'port 1.19', 'port 1.20', 'port 1.21',  'port 1.22','port 1.23', 
'port 1.24']

我发现这段代码有效,除了当我说端口1.23匹配正确的端口但也匹配1.2或端口1.16时,我也获得了端口1.1的匹配。

matches = {x for x in port_list if x in output}

这是我从脚本的较早部分拉端口的输出

LAB-5150-MES1.NMD*> config search string "virtual-switch ethernet add"
virtual-switch ethernet add vs 022NMD001111BL port 1.20 vlan 4
virtual-switch ethernet add vs 022NMD002222BL port 1.21 vlan 20
virtual-switch ethernet add vs 022NMD003333BL port 1.23 vlan 452

然后这就是我要从上方拉出端口,但在该额外端口上匹配的内容。

LAB-5150-MES1.NMD*> lldp set port 1.2 mode tx-rx notification off
LAB-5150-MES1.NMD*> lldp set port 1.20 mode tx-rx notification off
LAB-5150-MES1.NMD*> lldp set port 1.23 mode tx-rx notification off
LAB-5150-MES1.NMD*> lldp set port 1.21 mode tx-rx notification off

3 个答案:

答案 0 :(得分:3)

output必须是字符串,对吗?这就是为什么'port 1.1' in output实际上是True时是'port 1.16'的原因。因此,您可以将其简单地分为一个列表,然后检查其中是否包含端口号:

matches = {x for x in port_list if x.split()[1] in output.split()}

无需使用正则表达式;)

编辑:x.split()将字符串分成列表。每个分区都在一个空间上。因此它的结果是['port', '1.16']。我们使用[1]索引符号指定索引1上的对象(python索引从0开始)-'1.16'。这样,我们就可以检查数字是否在output的单词列表中。

答案 1 :(得分:0)

你可以做

matches = {x for x in port_list if x == output}

答案 2 :(得分:0)

使用in运算符,您正在使用子字符串匹配,这就是为什么当output包含port 1.23时,它也匹配port 1.2的原因。在这种情况下,应使用正则表达式确保匹配仅在单词边界上发生。

import re
matches = re.findall('\b(?:%s)\b' % '|'.join(port_list), output)