2017-07-25 8 views
0

を検索し、私はこのような何かを見た値で、本当に長いリスト(例切り捨て)を持っている:はだけなので完全に一致

derp = [[('interface_name', 'interface-1'), ('ip_address', '10.1.1.1'), ('mac_address', 'xx:xx:xx:xx:xx:xx')], [('interface_name', 'interface 2'), ('ip_address', '10.1.1.2'), ('mac_address', 'xx:xx:xx:xx:xx:xx')], [('interface_name', 'interface 3'), ('ip_address', '10.1.1.11'), ('mac_address', 'xx:xx:xx:xx:xx:xx')]] 

私はその巨大なリストを通過する機能を持っており、ちょうど試合を引き出しますIPに基づいていますが、問題は、正確な一致だけでなく、最後のオクテットのものと一致するようです。

findIP = sys.argv[1] 

def arpInt(arp_info): 
    for val in arp_info: 
     if re.search(findIP, str(val)): 
      interface = val.pop(0) 
      string = val 
      print string, interface[1] 

arpInt(derp) 

は、したがって、上記の場合には、findIP = '10 .1.1.1' それは10.1.1.1および10.1.1.11で戻ってくる場合。私はちょうど私の入力が正確にそれを強制的に強制する方法がなければならないと思います...

+0

IPv4アドレスは実際には32ビット整数です。小数点付き10進表記は人間が読みやすくするためのものです。テキスト表現を整数に変換すると、適切に順序付けして比較することができます。 –

+0

私の初心者のための謝罪@RonMaupin、あなたはあなたが何を意味するかについてもう少し詳細を与えることができますか? – DangerZone

+0

結果を追加します:第1オクテットに '16,777,216'(' 2^24')を掛け、第2オクテットに '65,536'(' 2^16')を掛け、第3オクテットに '256'(' 2^8 ')と第4オクテット。これにより、IPv4アドレスのバイナリ表現が32ビット整数になります。適切にソートするには、符号なし整数を使用します。完全一致の整数値を簡単に比較できます。 IPアドレスはIPヘッダーに配置され、ネットワークデバイスによって整数として使用されます。 IPv4アドレスのテキスト表現は人が読みやすいように使用されていますが、IPv4アドレスが表現され使用されるのは実際の方法ではありません。 –

答えて

0

正規表現を使用しないでください。文字列そのものを探してください。

data = [[('interface_name', 'interface-1'), 
     ('ip_address', '10.1.1.1'), 
     ('mac_address', 'xx:xx:xx:xx:xx:xx')], 
     [('interface_name', 'interface-1a'), 
     ('ip_address', '010.001.001.001'), 
     ('mac_address', 'xx:xx:xx:xx:xx:xx')], 
     [('interface_name', 'interface 2'), 
     ('ip_address', '10.1.1.2'), 
     ('mac_address', 'xx:xx:xx:xx:xx:xx')], 
     [('interface_name', 'interface 3'), 
     ('ip_address', '10.1.1.11'), 
     ('mac_address', 'xx:xx:xx:xx:xx:xx')]] 


key = '10.1.1.1' 
for interface, ip, mac in data: 
    if key in ip: 
     #print(interface, ip) 
     print([interface, ip, mac], interface[1]) 

もちろん、データのIPアドレスがあなたの例に従っている場合にのみ有効です。先行ゼロはありません。


あなたのアドレスが先行ゼロを持っている可能性がある場合ので、私は本当にかどうかを知りません、私は、このコンピュータ上のPython 3.xのを持っていない

key = '10.1.1.1' 
key = map(int, key.split('.')) 
for interface, ip, mac in data: 
    ip_address = ip[1] 
    ip_address = map(int, ip_address.split('.')) 
    if ip_address == key: 
     #print(interface, ip) 
     print([interface, ip, mac], interface[1]) 

あなたはアドレスの整数同等物を比較することができ地図オブジェクトはそのように比較することができます。そうでない場合は、条件としてall(a == b for a, b in zip(ip_address, key))を使用します。

+0

これは本当にうまくいった!私は同じ情報を得ることができ、それは実際にはインターフェイスからいくつかの情報を取り除き、それはいくつかのスイッチ/ルータの設定を確認するために使用する私のスクリプト(私はここに入れなかった)の2番目の部分をきれいにした。簡単な質問 - 'for interface、ip、ma​​c in data:'では、各タプルに名前を割り当てるだけです。 – DangerZone

+0

@DangerZone - 左側の名前の数が反復可能なものの長さと異なる場合、例外がスローされます。ここを参照してください。 https://www.python.org/dev/peps/pep-3132/。 [代入文](https://docs.python.org/3/reference/simple_stmts.html#assignment-statements)。 – wwii