不应使用正则表达式输出打印列表



输出不是预期的。我希望它在"系统"目录下打印有关"系统"的所有差异,并在"接口"目录下打印与"接口"相关的所有差异。"{ ... }"也没有打印,即使我有一个声明来捕捉它。代码如下:

import re
template_list = ['system','interfaces']
directory = '/templates/juniper/junos/vfirewall/'
diff = """[edit system name-server]
8.8.8.8 { ... }
+   4.4.4.4;
[edit interfaces ge-0/0/0 unit 0 family inet]
+       address 10.20.30.10/24;
-       address 10.50.30.10/24;
[edit interfaces]
+   ge-0/0/1 {
+       unit 2 {
+           family inet {
+               address 10.50.80.10/24;
+           }
+       }
+   }""".splitlines()
for template in template_list:
print("{}{}".format(directory,template))
for line in diff:
if(re.match('[edits({})'.format(template),line)):
print('{}'.format(line))
elif(re.match('{ ... }',line)):
print('{}'.format(line))
elif(re.match('^-',line)):
print('{}'.format(line))
elif(re.match('^+',line)):
print('{}'.format(line))
elif(re.match('[editsw.+',line)):
break

输出给出:

/templates/juniper/junos/vfirewall/system
[edit system name-server]
+   4.4.4.4;
/templates/juniper/junos/vfirewall/interfaces
>>> 

预期产出:

/templates/juniper/junos/vfirewall/system
[edit system name-server]
8.8.8.8 { ... }
+   4.4.4.4;
/templates/juniper/junos/vfirewall/interfaces
[edit interfaces ge-0/0/0 unit 0 family inet]
+       address 10.20.30.10/24;
-       address 10.50.30.10/24;
[edit interfaces]
+   ge-0/0/1 {
+       unit 2 {
+           family inet {
+               address 10.50.80.10/24;
+           }
+       }
+   }

两个主要问题:

  1. 您应该对正则表达式使用原始字符串,以便转义序列将逐字传递到正则表达式引擎,而不是作为字符串转义进行处理。

  2. 您需要使用re.search()而不是re.match(),因为后者仅在字符串的开头匹配(相当于用^开始 RE(。

小问题:...中的.应该转义以匹配字面意思,-不需要转义。

工作版本:

import re
template_list = ['system','interfaces']
directory = '/templates/juniper/junos/vfirewall/'
diff = """[edit system name-server]
8.8.8.8 { ... }
+   4.4.4.4;
[edit interfaces ge-0/0/0 unit 0 family inet]
+       address 10.20.30.10/24;
-       address 10.50.30.10/24;
[edit interfaces]
+   ge-0/0/1 {
+       unit 2 {
+           family inet {
+               address 10.50.80.10/24;
+           }
+       }
+   }""".splitlines()
for template in template_list:
print("{}{}".format(directory,template))
for line in diff:
if(re.search(r'[edits({})'.format(template),line)):
print('{}'.format(line))
elif(re.search(r'{ ... }',line)):
print('{}'.format(line))
elif(re.search(r'^-',line)):
print('{}'.format(line))
elif(re.search(r'^+',line)):
print('{}'.format(line))
elif(re.search(r'[editsw.+',line)):
break

最新更新