欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Python正则表达式【2】

程序员文章站 2022-04-19 13:09:16
...
接着昨天的的内容,今天直接实战。因正则表达式非常强大也很复杂,本次实验中超出上次所学范围的部分,请自行查阅相关文档,本教程仅帮助运维工程师快速上手,如果不理解也可以当作工具直接替换使用。

回顾Telnet、SSH自动巡检脚本里面的正则表达式:DeviceName = re.search('.*(?=#show run)',telreply).group(),telreply就是巡检的内容,那么打开日志开头就能看见:

R1>enable
Password:
R1#terminal length 
0
R1#show run
Building 
configuration...

很显然,这个正则表达式是要匹配在'#show'之前的任意字符(除换行符),那么当然就是R1了。

再做一个复杂点的实验,截取多一点的配置片段,比如下面的配置,要求找到这台设备每个接口的IP地址:

############################
!
interface 
FastEthernet0/0
ip address 
192.168.1.200 255.255.255.0
duplex half
!
interface 
GigabitEthernet1/0
no ip 
address
shutdown
negotiation 
auto
!
interface 
Serial2/0
ip address 
192.168.2.200 255.255.255.0
!
############################

把它赋值在log中:(真实环境是直接读取log日志)

log = ''' #这里是三引号,之后回车把上面的配置粘贴进来,之后回车三引号,回车。(三引号可以粘贴多行字串)。

Python正则表达式【2】

这时查看一下log:

>>> 
log
'\n!\ninterface 
FastEthernet0/0\n ip address 192.168.1.200 255.255.255.0\n duplex 
half\n!\ninterface GigabitEthernet1/0\n no ip address\n shutdown\n negotiation 
auto\n!\ninterface Serial2/0\n ip address 192.168.2.200 
255.255.255.0\n!\n'
>>>

可以发现字串都在一行,换行实际就是'\n',如果使用print(log),那么显示的效果就是上面那样有换行的了。

还可以发现Cisco设备的配置都是用感叹号(!)隔开的,每个接口的开头都是'interface',IP地址前面都是'ip address'。所以不难想象,正则表达式中有'interface(.*)\n',这个是匹配了某个接口配置的首行。配置结尾是'!',所以在'!'之前的表达式需要'(?=!)'。中间配置的行数不定,能确定的是至少有一行配置,并且会有换行符,即'(.*\n)+?)'。这里的'+?'表示非贪婪的匹配前面的表达式(.*\n)一次或者多次。圆括号可以达到捕获效果,但如果想要关掉捕获效果,在左括号后面跟随一个?:就可以了。这次实验是要匹配所有字串,所以使用的是're.findall()'。不多解释了,直接上代码:

ljds = 
re.findall('interface(.*)\n((?:.*\n)+?)(?=!)',log)
>>> 
ljds
[(' FastEthernet0/0', 
' ip address 192.168.1.200 255.255.255.0\n duplex half\n'), (' 
GigabitEthernet1/0', ' no ip address\n shutdown\n negotiation auto\n'), (' 
Serial2/0', ' ip address 192.168.2.200 255.255.255.0\n')]

结果是把每个接口的配置分成了接口名+配置的元组,嵌套在了列表里。

Python正则表达式【2】

接下来写个For循环把接口和IP再次抓出来:

Python正则表达式【2】

运行效果:

Python正则表达式【2】

试验完成!达到了获取每个接口IP地址的目的。

现在学会了这种方法,将来可以用它去监控设备的配置或状态,比如本来接口状态是'UP',如果变成'DOWN'了就发邮件通知你。

以上就是Python正则表达式【2】 的内容,更多相关内容请关注PHP中文网(www.php.cn)!