接著昨天的的內容,今天直接實戰。因Regex非常強大也很複雜,本次實驗中超出上次所學範圍的部分,請自行查閱相關文檔,本教程僅協助營運工程師快速上手,如果不理解也可以當作工具直接替換使用。
回顧Telnet、SSH自動巡檢指令碼裡面的Regex:DeviceName = re.search('.*(?=#show run)',telreply).group(),telreply就是巡檢的內容,那麼開啟日誌開頭就能看見:
R1>enablePassword:R1#terminal length 0R1#show runBuilding configuration...
很顯然,這個Regex是要匹配在'#show'之前的任一字元(除分行符號),那麼當然就是R1了。
再做一個複雜點的實驗,截取多一點的配置片段,比如下面的配置,要求找到這台裝置每個介面的IP地址:
############################!interface FastEthernet0/0ip address 192.168.1.200 255.255.255.0duplex half!interface GigabitEthernet1/0no ip addressshutdownnegotiation auto!interface Serial2/0ip address 192.168.2.200 255.255.255.0!############################
把它賦值在log中:(真實環境是直接讀取log日誌)
log = ''' #這裡是三引號,之後斷行符號把上面的配置粘貼進來,之後斷行符號三引號,斷行符號。(三引號可以粘貼多行字串)。
這時查看一下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'。所以不難想象,Regex中有'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')]
結果是把每個介面的配置分成了介面名+配置的元組,嵌套在了列表裡。
接下來寫個For迴圈把介面和IP再次抓出來:
運行效果:
實驗完成!達到了擷取每個介面IP地址的目的。
現在學會了這種方法,將來可以用它去監控裝置的配置或狀態,比如本來介面狀態是'UP',如果變成'DOWN'了就發郵件通知你。
以上就是PythonRegex【2】 的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!