2017-05-04 12 views
0

私はルーティングテーブルからIPを抽出する機能的なPython 2.7コードを持っています。 x.x.x.x/xx形式のipのみを抽出します。私はしかし、ルートテーブルのいくつかの行を除いて問題があります。たとえば、この行特定のIPを含めるか除外する正規表現

を:この行で

D  10.50.80.0/24 [90/3072] via 10.10.10.1, 3w6d, Vlan10 

私は気にすべてが10.50.80.0/24です。これが/ 24表記の唯一のIPであるため、私はそれをつかみ、正規表現に/を付けないで(例えば、10.10.10.1)を無視させることができます。しかし表に、我々は2つの異常の下にあります

 10.10.60.0/16 is variably subnetted, 58 subnets, 4 masks 
C  10.10.140.0/24 is directly connected, Vlan240 

私は、最初の行(10.10.60.0/16)二行目(10.10.140.0/24)にではなく、IPをキャプチャしたいと思います。プログラムはIPを抽出し、サブネットがテーブルで利用可能かどうかをチェックしています。 10.10.60.0/16は10.10.60.0/16がテーブルにあると言っているのではなく、このサブネットが可変サブネット化しているということだけを言っているので問題になります。

現在のところ、私のツールはこのIPをキャプチャしており、表に示すように10.10.60.0/16の範囲全体を真ではありません。私はいくつかの正規表現を編集しようとしましたが、実際にそれに満足していませんでした。誤ってサブネットを偶発的にスキップすることは特にありません。特に、最初のサブネットと似ている2番目のサブネットです。すべての正しいサブネットをキャプチャすることは非常に重要です。

誰かがこれを達成するための最良の正規表現編集を提案できますか?唯一の持っている行をスキップXXXX/XX可変サブネット化され、Xサブネット、Xマスクここ

私の現在のコードです:

match = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', text) 

おかげ デイモン

+0

これはCiscoデバイスでは、show ip route' 'からの出力のように見える - 実際にテーブルのルート(つまりサマリーではない)は、ルートの起源(静的、接続、OSPF、EIGRPなど)を示す最初の文字として常に文字を持ちます。スペースで始まる行を破棄するか、いくつかの文字で始まる行だけを見ることができます( 'show ip route'は可能なことを示します)。 – Ben

+0

これは良い解決策ですが、予期しないスペースや何かのために実際のIPを見逃す可能性があります。私は底の解決策がより安全だと信じています。 – Damon

答えて

2

私はあなたの質問を正しく持っている場合あなたの既存の正規表現がが後に続く任意のIP /サブネットをスキップして、変更可能にサブネット化されているようにしてください '。あなたは、この正規表現を使用できるということを行います。私はあなたの正規表現の末尾に\b(?! is variably)を追加しました

(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})\b(?! is variably) 
  • 終わり
  • \bは単語境界
  • (?! is variably)は否定先読み(?!を持って示していますIP /サブネットの後にテキストが「可変である」ことを確認します。

デモ:https://regex101.com/r/jTu8cj/1

マッチ:

D  10.50.80.0/24 [90/3072] via 10.10.10.1, 3w6d, Vlan10 
C  10.10.140.0/24 is directly connected, Vlan240 

は一致しません:

10.10.60.0/16 is variably subnetted, 58 subnets, 4 masks 
255.255.255.1 
+0

うまく働いた。私は似たようなものがあったが、\ bはなかった。 – Damon

関連する問題