使用正则表达式按其第一个八位字节对IP地址进行排序

时间:2017-06-10 12:36:49

标签: python string python-2.7 sorting

我正在尝试从日志文件中读取所有IP地址。我创建了一个唯一的IP地址列表,并希望根据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()

问题是我按照字符串中的第一个字符对列表进行排序。

1 个答案:

答案 0 :(得分:0)

字符串比较是"Lexicographical order",这就是为什么你得到第一个数字排序的印象。这是因为它按元素排序,首先它比较第一个字符,如果它们等于第二个字符,如果它们等于第三个字符,依此类推。

您需要将其转换为数字才能获得类似数字的比较:

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