2017-06-10 6 views
2

すべてのIPアドレスをログファイルから読み込もうとしています。私はregexを最初のオクタクトで使用してIPアドレスをソートする

import sys 
import re 

def ip_check(temp): 
    str=re.search(r"(\d+)\.(\d+)\.(\d+)\.(\d+)",temp) 
    return str.group(1) 

def main(): 
    file=open(sys.argv[1],'rU') 
    text=file.read() 
    file.close() 
    string = re.findall(r"\d+\.\d+\.\d+\.\d+",text) 
    ip_addr = list(set(string)) 
    for item in sorted(ip_addr, key=ip_check, reverse=False): 
    print item,'\n' 

if _ terms _name__ == '__main__': 
    main() 

問題は、私は文字列の最初の文字の面でソートされたリストを取得していているIPアドレスの面でユニークなIPアドレスのリストを作成し、ソートされたリストを表示したいです。

答えて

0

文字列の比較は"Lexicographical order"です。そのため、最初の数値で並べ替えるという印象を受けます。これは、要素ごとにソートするためです。最初に、最初の文字が等しい場合は2番目の文字が、3番目の文字が等しい場合は3番目の文字が比較されます。例えば

def ip_check(temp): 
    str=re.search(r"(\d+)\.(\d+)\.(\d+)\.(\d+)",temp) 
    return int(str.group(1)) # convert to integer 

あなたは数のような比較を取得するには数に変換する必要があり

def main(): 
    # I don't have your log file so I just made one up myself... 
    text = """128.128.123.1 
3.1.1.1 
0.0.0.1""" 
    string = re.findall(r"\d+\.\d+\.\d+\.\d+",text) 
    ip_addr = list(set(string)) 
    for item in sorted(ip_addr, key=ip_check, reverse=False): 
     print (item) 

if __name__ == '__main__': 
    main() 

することはできます:

0.0.0.1 
3.1.1.1 
128.128.123.1 
関連する問題