繁体   English   中英

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

[英]Match string exactly from list of strings

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

这是列表的示例:

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

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

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的单词列表上。

你可以做

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM