我从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
请告诉我这件事,我想我很接近:)
答案 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,逐个产生每个找到的项目。