【问题标题】:re.search to fetch all subblocksre.search 获取所有子块
【发布时间】:2020-05-24 08:30:39
【问题描述】:

我遇到了一个块的正则表达式问题。我正在尝试匹配块内的值。当我每次使用 re.search 匹配接口块中的所有实例时,它都以“实例 3”结尾。
如何获取该块内的所有实例行和值?

代码:

for instance in serviceList:
   serviceData = re.search('('+instance+'.*?\n)+\sinstance',block,re.DOTALL)

输入:

interface
 description 
 mtu 1992
 instance 1
  description OMCH Global Table 
  encapsulation dot1q 1100 second-dot1q 101
 !
 instance 2
  description UNENCRYPT
  bridge-domain 132
 !
 instance 3
  description ENCRYPT
 !
 instance 4
  description TEF
 !
!

【问题讨论】:

  • serviceList是什么,请准确分享
  • 块包含从一个接口到另一个接口的值,ServiceList 是我从块中获取的实例列表。 ['实例 1', '实例 2', '实例 3', '实例 4']
  • 你到底想从上面的输入示例中匹配什么?

标签: python regex search


【解决方案1】:
extract = re.search("instance \d+.*!", block, re.DOTALL).group().split("instance")

for i, j in enumerate(extract):
    if j:
        print("instance" + j)
        print('**' * 10)

输出

instance 1
  description OMCH Global Table 
  encapsulation dot1q 1100 second-dot1q 101
 !

********************
instance 2
  description UNENCRYPT
  bridge-domain 132
 !

********************
instance 3
  description ENCRYPT
 !

********************
instance 4
  description TEF
 !
!
********************

【讨论】:

  • 您好,感谢您抽出宝贵时间回复。我试过了,它只从块中获取第一个实例并跳转到另一个块,它们再次在那里搜索实例。换句话说,它不会针对一个块中的每个实例,只会处理第一个实例。
  • 你能在你的问题中添加预期的输出吗?
【解决方案2】:

它不适用于第四个实例,因为您希望正则表达式最后也匹配一个实例。最后一个(第 4 个)实例不以“instance”结尾。

如果您使用! 作为分隔符,那么您可以这样做 -

import re
my_re = r'(?P<instance_id>instance\s\d+)(?P<contents>[^!]*)'
my_input = '''
interface
 description
 mtu 1992
 instance 1
  description OMCH Global Table
  encapsulation dot1q 1100 second-dot1q 101
 !
 instance 2
  description UNENCRYPT
  bridge-domain 132
 !
 instance 3
  description ENCRYPT
 !
 instance 4
  description TEF
 !
!
'''

# create a map of instance id to contents
instance_to_contents = {}
for instance_id, contents in re.findall(my_re, my_input, flags=re.DOTALL):
    instance_to_contents[instance_id] = contents


serviceList = ['instance 1', 'instance 2', 'instance 3', 'instance 4']
# look them up
for instance in serviceList:
    print(instance_to_contents[instance])

或者,如果您不想在开始时为所有这些创建映射(如果输入太大而您只需要搜索几个实例),您可以在 for 循环中创建正则表达式

serviceList = ['instance 1', 'instance 2', 'instance 3', 'instance 4']
# look them up
for instance in serviceList:
    my_re = instance + '(?P<contents>[^!]*)'
    print(re.findall(my_re, my_input, flags=re.DOTALL))

【讨论】:

  • 您好,谢谢您的回复。我尝试了第二个选项,它几乎可以工作,但是一旦它搜索了第一个接口块中的所有实例,它就会转到下一个并继续。但是一旦它完成了所有块,它就会再次单独进入第一个块并获取实例。知道为什么会这样吗?或者如何在完成所有块后打破?@algrebe
  • @algrebe 稍微修改了上面的模式"(instance\s\d+)([^!]*)",得到相同的输出添加Named capturing group的目的是什么
  • @Suman - 我无法理解你在问什么。你能用你尝试过的和观察到的来更新你的问题吗?这可能有助于我找出问题所在。
  • @Sushanth 没有理由,这只是我的习惯。可以删除。
猜你喜欢
  • 2019-05-28
  • 2012-11-22
  • 2014-09-07
  • 2021-08-19
  • 2015-09-06
  • 2018-07-30
  • 2017-01-27
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多