2

各デバイスとその IP アドレスをキャプチャできるように、一連の SHOW CDP NEIGHBORS DETAIL 出力を解析しようとしています。

私が直面している問題は、一部のデバイスに複数の IP アドレスが割り当てられている可能性があることです。出力例を次に示します。

Device ID: RTPER1.MFN21Mb.domain.local
Entry address(es): 
  IP address: 200.152.51.3
  IP address: 82.159.177.233
  IP address: 201.152.51.140
  IP address: 84.252.100.3
Platform: Cisco 2821,  Capabilities: Router Switch IGMP 

入力をキャプチャするためにこの正規表現を作成しました.gskinnerによると、4つのIPアドレスすべてに一致しますが、キャプチャは最後のものにすぎません(正規表現から予想されるように)

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)+

そこで私はオンラインでこれを行う方法を見つけました。ここで提案されている正規表現を試してみました Python regex で繰り返しサブパターンをキャプチャしていますが、正規表現モジュールを使用しても出力は変わりませんでした。リストの最後のIPアドレスしか取得できず、他のIPアドレスは取得できません。

私が得る例に従って

temp = regex.match(r'Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)+', file)
print temp

Temp は None を返します。

私がfindallを行う場合。最後の IP アドレス 84.252.100.3 だけが返されます

次のような複数のキャプチャ グループを追加すると、

temp = regex.findall(r'Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?', file)
print temp

複数の IP アドレスを持つものにのみ一致し、他のものには一致しません

うまくいけば、誰かが助けてくれるでしょう。

4

1 に答える 1

1

私が知る限り、定量化された (反復された) キャプチャ グループを反復できるのは .NET だけです。この(有限の)代替案を検討してください:

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)(?:IP address: ([0-9.]+)\s+)?(?:IP address: ([0-9.]+)\s+)?(?:IP address: ([0-9.]+)\s+)?
                                                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

これにより、 で最大 1 つの IP アドレスが取得され、 、、および$2でさらに最大 3 つのIP アドレスが取得されます。(もちろん、慣用的にこの表記法を使用しています。) いくつでも追加できます。すべての IP アドレスを 1 つのグループに含める必要がある場合 (つまり)、唯一の選択肢は、それらにテキストを含めることです。$3$4$5$ $2

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+((?:IP address: (?:[0-9.]+)\s+)+)
                                                      ^                ^^             ^
于 2013-04-09T17:16:12.707 に答える