2017-11-21 9 views
4

私はネットワークエンジニアであり、私の指先をプログラミングに浸しています。私はPythonを試してみることを勧められました。Pythonの正規表現を複数回マッチさせ、別々に結果を格納します。

私がやろうとしているのは、特定のデータを保存し、文字列を複数の行とregexpでマッチングすることです。 SourceDataに保存されたデータを取得しました。

SourceData = ' 
ip route 22.22.22.22 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 33.33.33.33 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 11.22.33.44 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 11.11.12.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 11.11.13.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 11.11.14.0 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 44.44.44.0 255.255.255.0 TenGigabitEthernet0/1/0 1.1.1.1' 

SourceDataに格納されている行数は、常に不明です。無制限の行に対して0行(空)にすることができます。

ip1 = re.search('11\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', SourceData) 
     if ip1: 
      ip1 = ip1.group() 

を確認します:

>>> print ip1 
11.22.33.44 

は、私はこれは私が最初のように作ってみたものです11.

から始まるのIPv4アドレスを含むすべての行をマッチさせたいです

OK、うまくいくようです。私が説明するように、より一致するSourceDataをチェックしていきますか、学ぶこと

ip1 = 11.22.33.44 
ip2 = 11.11.12.11 
ip3 = 11.11.13.11 
ip4 = 11.11.14.0 

次へ:アイデアは、提供された例で、この場合の最終的な結果は4試合となり、全体SourceDataが一致したときにということです後でコード内で使用するために複数のマッチを保存するにはどうすればよいですか?たとえば、コードの後半で、特定の一致の値を使用したい場合は、一致番号4(11.11.14.0)と言うことができます。

私はPythonと正規表現のためのいくつかのガイドラインを読みましたが、私はかなりそれを理解していないようです:)

答えて

3

あなたは試合

>>> re.findall(r'11\.\d{1,3}\.\d{1,3}\.\d{1,3}', SourceData) 
['11.22.33.44', '11.11.12.11', '11.11.13.11', '11.11.14.0'] 
2

いくつかの方法のすべてを返すようにre.findallを使用することができ、そのうちの一つがあること:

import re 

string = """ 
ip route 22.22.22.22 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 33.33.33.33 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 11.22.33.44 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 11.11.12.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 11.11.13.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 11.11.14.0 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
ip route 44.44.44.0 255.255.255.0 TenGigabitEthernet0/1/0 1.1.1.1' 
""" 

rx = re.compile(r'^[^\d\n]*(11(?:\.\d+){3})', re.M) 

lines = [match.group(1) for match in rx.finditer(string)] 
print(lines)  

この利回り:

['11.22.33.44', '11.11.12.11', '11.11.13.11', '11.11.14.0'] 


コアはここ

^   # match start of the line 
[^\d\n]*  # NOT a digit or a newline, 0+ times 
11   # 11 
(?:\.\d+){3} # .0-9 three times 
.+   # rest of the line 
残りは re.finditer()を介して行われ

とリスト内包です。
a demo on regex101.comを参照してください。

あなたは正しいアドレス、ちょうど "ip route"後、一致していることを確認するために、正の後読みで re.findallを使用することができます
1

import re 
s = """ 
    ip route 22.22.22.22 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
    ip route 33.33.33.33 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
    ip route 11.22.33.44 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
    ip route 11.11.12.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
    ip route 11.11.13.11 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
    ip route 11.11.14.0 255.255.255.255 TenGigabitEthernet0/1/0 1.1.1.1 
    ip route 44.44.44.0 255.255.255.0 TenGigabitEthernet0/1/0 1.1.1.1' 
""" 
final_ips = re.findall('(?<=ip route\s)11[\d\.]+', data) 

出力:

['11.22.33.44', '11.11.12.11', '11.11.13.11', '11.11.14.0'] 
関連する問題