Python 使用RegEx对对象组配置进行分组
我有一个来自Cisco ASA的配置,我需要编写一个Python正则表达式来捕获对象组中的所有内容,并将它们分组以供进一步处理 例如: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
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*)*
-1个或多个未跟在\s+(?!对象组\b)
整字后面的空白符号对象组
-零个或多个非空白符号\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())