【问题标题】:Find two different words in a file在文件中查找两个不同的单词
【发布时间】:2017-10-01 12:37:01
【问题描述】:

我从 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”。如果我找到下面两行的“未标记”一词,我想返回“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

请在这方面给我建议,我想我很接近了:)

【问题讨论】:

  • 您的正则表达式需要正确处理“名称”行,以及“未标记”行开头的空格。这些星号在您的数据文件中吗?如果是这样,正则表达式也需要处理它们。
  • 谢谢 - 星号应该把这个词放在粗体......在我看来,我会检查“vlan xxx”之后的两行或从“vlan xxxx”中提取一行到“未标记”。是否有意义 ?谢谢

标签: python regex findall


【解决方案1】:

这是一个可以满足您需求的正则表达式。我在数据中添加了一个额外的条目,因此我们可以看到正则表达式正确处理了一个不符合您正在寻找的模式的条目。

关键是指定多行模式标志(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,它会一个接一个地生成每个找到的项目。

【讨论】:

  • 很抱歉,迟到了。您的代码正在按预期工作 :) 非常感谢您的帮助!
  • @ArmandChollet 我的荣幸!如果我的回答对您有所帮助,请考虑accepting
猜你喜欢
  • 2013-04-29
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多