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

Python 在文件中查找两个不同的单词,python,regex,findall,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”。如果我在下面

我从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”。如果我在下面两行找到单词“untaged”,我想返回“vlanxxxx”

我的代码如下:

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
def find_vlan_untaged(文件):
vlan=re.findall(r'vlan\d{4}\n\n untaged',file)#查找vlan
如果长度(未标记)<1:
返回“没有未标记的VLAN”
其他:
对于vlan中的每个节点:
返回vlan xxxx

请给我一些建议,我想我很接近:)

这里有一个正则表达式,它可以满足您的需要。我在数据中添加了一个额外的条目,这样我们可以看到正则表达式正确地处理了一个不符合您所寻找的模式的条目

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

输出

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

顺便说一句


不执行您想要的操作:它将在第一次迭代时从函数返回。我建议您只需返回
.findall
找到的整个列表。或者你可以把函数变成一个一个一个地找到每一个找到的项目。

你的正则表达式需要正确处理“名称”行,并在“未标记”行的开头空白处。这些星号在您的数据文件中吗?如果是这样,正则表达式也需要处理它们。谢谢-星号应该用粗体字写。。。在我看来,我会检查“vlan xxx”后面的两行,或者从“vlan xxxx”提取一个行块到“untaged”。这有意义吗?非常感谢您的及时回复。。。您的代码正在按预期工作:)非常感谢您的帮助@阿曼德:我很高兴!如果我的回答对你有帮助,请考虑一下。
['vlan 1111', 'vlan 2222', 'vlan 3333']
for each in vlan:
    return vlan xxxx