使用python在文本文件中查找单词出现的第n个实例

时间:2014-06-27 12:31:15

标签: python regex string file list-comprehension

我正在使用paramiko登录设备并运行一些命令,然后仅捕获相关输出。代码的相关部分如下所示:

stdin, stdout, stderr = ssh.exec_command('show interface')
print stdout.read()

这给出了以下输出:

Ethernet interface 0:0
Internet address:     171.182.204.207 netmask 255.255.255.0
Internet address:     fe80::2d0:83ff:fe06:4c67 prefixlen 64
MTU size:             1500
Link status:          configured to full duplex, 1 gigabit/sec network
Member of the bridge: none
Ethernet interface 0:1
Internet address:     fe80::2d0:83ff:fe06:4c66 prefixlen 64
MTU size:             1500
Link status:          autosensed to full duplex, 1 gigabit/sec network
Member of the bridge: none

现在,我只想要链接状态,所以我这样做了:

stdin, stdout, stderr = ssh.exec_command('show interface')
link = '\n'.join(item for item in stdout.read().splitlines() if 'Link' in item)
print link

现在我明白了:

Link status:          configured to full duplex, 1 gigabit/sec network
Link status:          autosensed to full duplex, 1 gigabit/sec network

正常工作。但是,我想要的是在列表理解中指定事件,以便我只获得关键字Link的第一,第二或第n次出现。

3 个答案:

答案 0 :(得分:2)

您有三种选择。

将所有项目存储在列表中,然后使用索引编制。但这会在内存中创建一个不必要的列表:

links = [item for item in stdout.read().splitlines() if 'Link' in item]
index = 5
print links[index]

或者使用itertools.islice,并将您在代码中使用的生成器传递给它:

from itertools import islice
index = 5
links = (item for item in stdout.read().splitlines() if 'Link' in item)
print next(islice(links, index, index+1))

或者甚至更好地使用以下生成器itertools.islice。在这里,我没有使用.read().splitlines(),因为他们将所有内容都读入内存:

links = (item for item in stdout if 'Link' in item)
print next(islice(links, index, index+1))

如果你只想在字符串的开头匹配item.startswith('Link'),你也可以使用'Link',但是如果你想在字符串的任何地方匹配它,那么忽略它。

答案 1 :(得分:1)

为什么不直接索引列表理解?

links = [item for item in stdout.read().splitlines() if 'Link' in item]
print links[n] # index here

答案 2 :(得分:1)

occurence = 2
link = [item for item in stdout.read().splitlines() if 'Link' in item][occurence]