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



我正在尝试从日志文件中读取所有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()

问题是我正在根据字符串中的第一个字符对列表进行排序。

字符串比较是按"词典顺序"进行的,这就是为什么你觉得它是按第一个数字排序的。那是因为它按元素排序,首先比较第一个字符,如果它们相等,则比较第二个字符,如果它们相等,则比较第三个字符,依此类推。

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

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

最新更新