Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用RegEx对对象组配置进行分组_Python_Regex_Cisco - Fatal编程技术网

Python 使用RegEx对对象组配置进行分组

Python 使用RegEx对对象组配置进行分组,python,regex,cisco,Python,Regex,Cisco,我有一个来自Cisco ASA的配置,我需要编写一个Python正则表达式来捕获对象组中的所有内容,并将它们分组以供进一步处理 例如: object-group network FTP description FTP Access network-object host BCD1 network-object host BCD2 object-group network NTP description NTP Access network-object host ABC1 netwo

我有一个来自Cisco ASA的配置,我需要编写一个Python正则表达式来捕获对象组中的所有内容,并将它们分组以供进一步处理

例如:

object-group network FTP
 description FTP Access
 network-object host BCD1
 network-object host BCD2
object-group network NTP
 description NTP Access
 network-object host ABC1
 network-object host ABC2
 network-object host ABC3
object-group service sample_service tcp
 description Ports 1 2 3
 port-object range 80 81
 port-object eq pop3
 port-object eq imap4
 port-object range 443 444
object-group service 8080 tcp
 description Servers
最终结果应该是这样的:

Group 1: object-group network FTP
          description FTP Access
          network-object host BCD1
          network-object host BCD2

Group 2:  object-group network NTP
          description NTP Access
          network-object host ABC1
          network-object host ABC2
etc.
正如我所说,我在这方面很糟糕,但我试图想出一些办法,但结果很糟糕

(object-group\s[^!]*)object or (object-group[^!]*)

这两种方法都失败了。

您可以在使用这个正则表达式时牢记展开循环技术:

\bobject-group\b\S*(?:\s+(?!object-group\b)\S*)*
看。它基本上与
(?s)对象组(?:(!\b对象组\b.)*
(?s)对象组。*(?=\b对象组\b |$)
相同,但效率更高

说明:

  • \b对象组\b
    -字符的文字序列
    对象组
    (由于
    \b
    单词边界而形成的一个完整单词)
  • \S*
    -零个或多个非空白符号
  • (?:\s+(?!对象组\b)\s*)*
    -零个或多个。。。
    • \s+(?!对象组\b)
      -1个或多个未跟在
      对象组
      整字后面的空白符号
    • \S*
      -零个或多个非空白符号
:


你不需要一个复杂的、难以理解的正则表达式就可以做到这一点。只需在以
对象组
开头的行上遍历文件,并建立列表字典

您可以使用或使用
列表
执行此操作。我更喜欢后者,它将为您提供一本有助于进一步处理的词典:

from collections import defaultdict

object_groups = defaultdict(list)
key = 0
with open('cisco.cfg') as f:
    for line in f:
        if line.startswith('object-group'):
            key += 1
        object_groups[key].append(line.strip())

from pprint import pprint
pprint(object_groups.items())
假设您的示例输入,输出将是:

[(1, ['object-group network FTP', 'description FTP Access', 'network-object host BCD1', 'network-object host BCD2']), (2, ['object-group network NTP', 'description NTP Access', 'network-object host ABC1', 'network-object host ABC2', 'network-object host ABC3']), (3, ['object-group service sample_service tcp', 'description Ports 1 2 3', 'port-object range 80 81', 'port-object eq pop3', 'port-object eq imap4', 'port-object range 443 444']), (4, ['object-group service 8080 tcp', 'description Servers'])]
这将创建一个类似的字典,但具有键
'network FTP'
'network NTP'
'service sample\u service tcp'
等。

只要提到您的regexp是不可靠的,因为
[^!]*
匹配任何不属于
的字符。非常感谢斯特里比雪夫!正则表达式有效!一个简单的问题,这不是什么大不了的,我已经找到了一个工作,但如果你能帮我,那就太棒了。在组对象之后是访问列表配置,您的正则表达式也会捕获它们。有没有办法把他们排除在比赛之外。我的目标是打开running config并在其上执行正则表达式,而不将其切碎。我相信您所需要的只是添加该字符串作为替代:。感谢您向我展示此mhawke!这真是太棒了。我喜欢这个方法,因为我不必写正则表达式@戈斯特:没错。正则表达式可能很难理解和维护。这种方法很容易理解,如果像往常一样不可避免,可以在以后修改。我不知道你为什么接受regex的答案,但也许这是你的要求?我希望我能选择两个答案,老实说,我更喜欢你的答案,因为我能理解背后的逻辑,但我的问题是关于regex和Stribizev的回答。如果我不注意他的工作,那就不公平了。你多走了一英里,向我展示了完全不同的方法,我非常感激@戈斯特:这很公平。
[(1,
  ['object-group network FTP',
   'description FTP Access',
   'network-object host BCD1',
   'network-object host BCD2']),
 (2,
  ['object-group network NTP',
   'description NTP Access',
   'network-object host ABC1',
   'network-object host ABC2',
   'network-object host ABC3']),
 (3,
  ['object-group service sample_service tcp',
   'description Ports 1 2 3',
   'port-object range 80 81',
   'port-object eq pop3',
   'port-object eq imap4',
   'port-object range 443 444']),
 (4, ['object-group service 8080 tcp', 'description Servers'])]
from collections import defaultdict

object_groups = defaultdict(list)
key = None
with open('cisco.cfg') as f:
    for line in f:
        if line.startswith('object-group'):
#            key = line.strip()                      # the whole line
            key = line.strip().partition(' ')[-1]    # just the object group definition
        else:
            object_groups[key].append(line.strip())

from pprint import pprint
pprint(object_groups.items())