在文件中找到两个不同的单词

时间:2017-10-01 12:37:01

标签: python regex findall

我从Python开始。

以下是我要搜索的文字:

vlan 1111
   name "VLAN1111"
   untagged 2
   tagged 10
   no ip address
   exit
vlan 2222
   name "VLAN2222"
   untagged 5
   exit
vlan 3333
   name "VLAN3333"
   untagged 3
   no ip address
   exit

我想搜索所有文字“vlan xxxx”。如果我找到下面两行的“untagged”这个词,我想返回“vlan xxxx”。

我的代码是这样的:

def find_vlan_untagged(file):
    vlan = re.findall(r'vlan \d{4}\n\n untagged', file)  # Finds VLAN

    if len(untagged) < 1:
        return 'No untagged VLAN'

    else:
        for each in vlan:
            return vlan xxxx

请告诉我这件事,我想我很接近:)

1 个答案:

答案 0 :(得分:0)

这是一个正如你想要的正则表达式。我在数据中添加了一个额外的条目,因此我们可以看到正则表达式正确处理了一个与您正在寻找的模式不相符的条目。

关键是指定多线模式标志(使用re.M),并使用非贪婪匹配(使用*?)。

import re

data = '''\
vlan 1111
   name "VLAN1111"
   untagged 2
   tagged 10
   no ip address
   exit
vlan 2222
   name "VLAN2222"
   untagged 5
   exit
vlan 4444
   name "VLAN4444"
   tagged 44
   exit
vlan 3333
   name "VLAN3333"
   untagged 3
   no ip address
   exit
'''

pat = re.compile(r'^(vlan \d{4})\n.*?\n\s*untagged', re.M)
print(pat.findall(data))

<强>输出

['vlan 1111', 'vlan 2222', 'vlan 3333']

顺便说一句,

for each in vlan:
    return vlan xxxx

没有做你想做的事:它会在第一次迭代时从函数返回。我建议您只返回.findall找到的整个列表。或者你可以将函数变成generator,逐个产生每个找到的项目。