2

現在、re.split("\n([^\s])", data)以下に示すように簡単に必要なものをほぼ取得できますが、問題は、結果のリストに、リスト内の独自のアイテムとして単一の非空白文字の一致が含まれることです。スクリプトの下の出力例。「VLAN」の「V」が独自の項目として取り込まれていることに注意してください。

これを行うためのより良い方法があるかどうかも疑問に思っています。おそらく、表形式のデータを辞書などに変換することを処理するライブラリを含めることができます。

#!/usr/bin/python
import re
import sys

data = """
VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Fa0/2, Fa0/3, Fa0/4, Fa0/5, Fa0/6, Fa0/7
                                                Fa0/8, Fa0/9, Fa0/10, Fa0/11, Fa0/12
                                                Fa0/13, Fa0/14, Fa0/15, Fa0/16, Fa0/17
                                                Fa0/18, Fa0/19, Fa0/20, Fa0/21, Fa0/22
                                                Fa0/23, Fa0/24, Gi0/2
1002 fddi-default                     act/unsup
1003 token-ring-default               act/unsup
1004 fddinet-default                  act/unsup
1005 trnet-default                    act/unsup
"""

lines = re.split("\n([^\s])", data)
print lines

出力:

['', 'V', 'LAN Name Status Ports', '-', '--- --------------------------- ----- --------- -------------------------------', '1' , ' デフォルト アクティブ Fa0/2、Fa0/3、Fa0/4、Fa0/5、Fa0/6、Fa0/7\n
Fa0/8、Fa0/9、Fa0/10、Fa0/11、Fa0/12\n
Fa0/13、Fa0/14、Fa0/15、Fa0/16、Fa0/17\n
Fa0/18、Fa0/19、Fa0/20、Fa0/21、Fa0/22\n
Fa0/23、Fa0/24、 Gi0/2', '1', '002 fddi-default
act/unsup', '1', '003 token-ring-default act/unsup', '1', '004 fddinet-default act/unsup', ' 1', '005 trnet-default act/unsup\n']

ありがとう!

編集lines = re.findall(".*[^\n\W]*", data)おそらくより良いアプローチのようです(nmは機能しません、申し訳ありません)が、この全体はまだかなりハッキリしているので、別の提案を聞きたいです。

4

5 に答える 5

3

NTC テンプレートは、さまざまな Cisco IOS コマンド出力 (およびその他のネットワーク デバイス) を解析するための一連のテンプレートを提供します。テンプレートはTextFSMと連携して実際の解析を行います。

例えば:

>>> from ntc_templates.parse import parse_output
>>> vlan_output = (
        "VLAN Name                             Status    Ports\n"
        "---- -------------------------------- --------- -------------------------------\n"
        "1    default                          active    Gi0/1\n"
        "10   Management                       active    \n"
        "50   VLan50                           active    Fa0/1, Fa0/2, Fa0/3, Fa0/4, Fa0/5,\n"
        "                                                Fa0/6, Fa0/7, Fa0/8\n"
    )
>>> vlan_parsed = parse_output(platform="cisco_ios", command="show vlan", data=vlan_output)
>>> vlan_parsed
[
    {
        'vlan_id': '1',
        'name': 'default',
        'status': 'active',
        'interfaces': ['Gi0/1']
    },
    {
        'vlan_id': '10',
        'name': 'Management',
        'status': 'active',
        'interfaces': []
    },
    {
        'vlan_id': '50',
        'name': 'VLan50', 'status': 'active',
        'interfaces': ['Fa0/1', 'Fa0/2', 'Fa0/3', 'Fa0/4', 'Fa0/5', 'Fa0/6', 'Fa0/7', 'Fa0/8']
    }
]
>>> 
于 2019-08-26T07:42:37.490 に答える
0

これはおそらく最善の方法ではありませんが、少なくとも解決策です。re モジュールの代わりに regex モジュールを使用します。

lines = regex.split("\n(?=[^\s])", data)

組み込みの re モジュールとは異なり、正規表現モジュールではゼロ幅の一致で分割できるため、先読みを使用して次の文字が一致する位置で分割できます。

参考文献:

于 2015-08-20T21:15:14.540 に答える
0

最近では、専用の既存のライブラリを調べて解析を行うことをお勧めします。私が見つけたそのようなライブラリの例の 1 つはciscoconfparseで、IOS 構成 (およびその他の構成) を解析して、構成操作に役立つ子/親の回線関係を維持する回線オブジェクトにします。

于 2019-02-12T20:34:44.230 に答える