簡體   English   中英

re.search不提供多組輸出

[英]re.search not giving output with multiple groups

我需要在字典中打印給定輸入文件中的所有匹配項。

================================================== ====================輸入文件:

RT-01#sh版本Cisco IOS軟件,C3900軟件(C3900-UNIVERSALK9-M),版本15.7(3)M4b,發行軟件(fc1)技術支持: http : //www.cisco.com/techsupport版權所有(c)思科系統公司1986-2019年.prod_rel_team於19年5月7日星期二18:56進行了編譯

ROM:系統引導程序,版本15.0(1r)M16,發布軟件(fc1)

RT-01的正常運行時間為1周,6天,18小時,45分鍾,系統通過重新加載時間在UTC星期四14:40:06返回到ROM星期四2019年8月22日系統在UTC星期四14:42:15重新啟動星期四2019年8月22日“ flash0:c3900-universalk9-mz.SPA.157-3.M4b.bin”上次重新加載類型:正常重新加載上次重新加載原因:重新加載命令

本產品包含加密功能,並受美國和當地國家有關進口,出口,轉讓和使用的法律的約束。 交付思科密碼產品並不意味着第三方有權導入,導出,分發或使用加密。 進口商,出口商,分​​銷商和用戶有責任遵守美國和當地法律。 通過使用本產品,您同意遵守適用的法律和法規。 如果您無法遵守美國和當地法律,請立即退回該產品。

可以在以下位置找到有關管理思科密碼產品的美國法律的摘要: http : //www.cisco.com/wwl/export/crypto/tool/stqrg.html

如果您需要進一步的幫助,請發送電子郵件至export@cisco.com與我們聯系。

具有C3900-SPE150 / K9的Cisco CISCO3945-CHASSIS(修訂版1.0),具有978944K / 69632K字節的內存。 處理器板ID FLNARU56836 9千兆位以太網接口68終端線1虛擬專用網(VPN)模塊DRAM配置為72位寬且啟用了奇偶校驗。 255K字節的非易失性配置存儲器。 255488K字節的ATA系統CompactFlash 0(讀/寫)許可證信息:

許可證UDI:設備號PID SN * 1 C3900-SPE150 / K9 FLNARU56836

套件的套件許可信息:'c3900'套件套件當前類型套件下次重新啟動FoundationSuiteK9無無無securityk9 datak9

AdvUCSuiteK9無無無uck9 cme-srst多維數據集

模塊的技術包許可證信息:“ c3900”

技術技術包

當前類型下次重啟ipbase ipbasek9永久ipbasek9安全securityk9永久securityk9 uc無無無數據無無無

配置寄存器為0x2102

================================================== ==================代碼:

import re
import collections

systemfields = ["Name", "Model", "System ID", "Image"]

command = ''
name = ''
systeminfo = collections.OrderedDict()
systeminfo[name] = collections.OrderedDict(zip(systemfields, [''] * len(systemfields)))
infile = open("testfile.txt", "r")
for line in infile:
    if command == 'show version' and name != '':
    # extracts information as per patterns
        m = re.search("Processor board ID (.*)", line)
        if m:
            systeminfo[name]['System ID'] = m.group(1)
            continue
        m = re.search("Cisco\s* (.*)-CHASSIS", line)
        if m:
            systeminfo[name]['Model'] = m.group(1)
            continue
        m = re.search("^cisco (.*) processor", line)
        if m:
            systeminfo[name]['Model'] = m.group(1)
            continue
        m = re.search("^Cisco (.*) \(revision", line)
        if m:
            systeminfo[name]['Model'] = m.group(1)
            continue
        m = re.search('System image file is \"flash0:\/?(.*)\.bin\"', line)
        if m:
            systeminfo[name]['Image'] = m.group(1)
            continue
        m = re.search('System image file is \"flash:\/.*\/(.*)\.bin\"', line)
        if m:
            systeminfo[name]['Image'] = m.group(1)
            continue
        m = re.search('System image file is \"bootflash:(.*)\.bin\"', line)
        if m:
            systeminfo[name]['Image'] = m.group(1)
            continue
        m = re.search('System image file is \"sup-bootflash:(.*)\.bin\"', line)
        if m:
            systeminfo[name]['Image'] = m.group(1)
            continue

print(systeminfo)

預期產量:

[('名稱','RT-01'),('型號','CISCO3945'),('系統ID','FLNARU56836'),('圖像','c3900-universalk9-mz.SPA.157- 3.M4b.bin')])

使用re.search將返回正則表達式模式產生匹配項的第一個位置,並返回一個對應的match對象。

您可以使用捕獲組獲得4個匹配項,該捕獲組可以在代碼中使用。

有關模式的簡短說明。

名稱:

^([^\s#]+)#
  • ^字符串開頭
  • ([^\\s#]+)捕獲組1匹配1次以上的任何字符,除#或空白字符
  • #從字面上匹配

模型:

^Cisco ([^-\s]+)
  • ^字符串開頭
  • Cisco從字面上看與空間匹配
  • ([^-\\s]+)捕獲組1匹配任何字符+ 1次,除-和空白字符

系統編號:

Processor board ID (\S+)
  • Processor board ID逐字匹配空間
  • (\\S+)捕獲組1匹配1+次非空格字符

圖片:

flash\d+:([^"]+)
  • flash\\d+:匹配的Flash,1個以上的數字和:
  • ([^"]+)捕獲組1匹配除"

Python演示

例如:

name = re.search(r"^([^\s#]+)#", test_str, re.M)
print(name.group(1))

model = re.search(r"^Cisco ([^-\s]+)", test_str, re.M)
print(model.group(1))

systemId = re.search(r"Processor board ID (\S+)", test_str)
print(systemId.group(1))

image = re.search(r'"flash\d+:([^"]+)', test_str)
print(image.group(1))

輸出量

RT-01
CISCO3945
FLNARU56836
c3900-universalk9-mz.SPA.157-3.M4b.bin

我的猜測是,類似於以下內容的表達式可能會稍微接近所需的輸出,並且您可能只想為要捕獲的對象添加一些左右邊界,例如:

(?<=ID\s)[A-Z0-9]{11}|(?<=Cisco\s)[A-Z0-9]{9}|^[A-Z]{2,}-[0-9]{2,}(?=\suptime)|(?<=")[^:]+:[a-z0-9]+-[a-z0-9]+-[^"]+

測試

import re

string = """

RT-01 uptime is 1 week, 6 days, 18 hours, 45 minutes System returned to ROM by reload at 14:40:06 UTC Thu Aug 22 2019 System restarted at 14:42:15 UTC Thu Aug 22 2019 System image file is "flash0:c3900-universalk9-mz.SPA.157-3.M4b.bin" Last reload type: Normal Reload Last reload reason: Reload Command

This product contains cryptographic features and is subject to United States and local country laws governing import, export, transfer and use. Delivery of Cisco cryptographic products does not imply third-party authority to import, export, distribute or use encryption. Importers, exporters, distributors and users are responsible for compliance with U.S. and local country laws. By using this product you agree to comply with applicable laws and regulations. If you are unable to comply with U.S. and local laws, return this product immediately.

A summary of U.S. laws governing Cisco cryptographic products may be found at: http://www.cisco.com/wwl/export/crypto/tool/stqrg.html

If you require further assistance please contact us by sending email to export@cisco.com.

Cisco CISCO3945-CHASSIS (revision 1.0) with C3900-SPE150/K9 with 978944K/69632K bytes of memory. Processor board ID FLNARU56836 9 Gigabit Ethernet interfaces 68 terminal lines 1 Virtual Private Network (VPN) Module DRAM configuration is 72 bits wide with parity enabled. 255K bytes of non-volatile configuration memory. 255488K bytes of ATA System CompactFlash 0 (Read/Write) License Info:

"""

print(re.findall(r'(?<=ID\s)[A-Z0-9]{11}|(?<=Cisco\s)[A-Z0-9]{9}|^[A-Z]{2,}-[0-9]{2,}(?=\suptime)|(?<=")[^:]+:[a-z0-9]+-[a-z0-9]+-[^"]+', string, re.M))

輸出量

['RT-01', 'flash0:c3900-universalk9-mz.SPA.157-3.M4b.bin', 'CISCO3945', 'FLNARU56836']

如果您想瀏覽/簡化/修改該表達式,請在regex101.com的右上方面板中進行說明 如果願意,您還可以在此鏈接中觀看,它將如何與某些示例輸入匹配。


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM