V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
gock
V2EX  ›  Python

求助,怎样把大量的 ip 地址转换为 ip 段

  •  
  •   gock · 2015-07-22 20:45:31 +08:00 · 4681 次点击
    这是一个创建于 3419 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例子:
    现在有很多的ip,每两个之间用"|"分割,现在需求把这些ip转换成x.x.x.0-x.x.x.255并去掉重复,求代码,谢谢!
    13 条回复    2015-07-24 22:00:43 +08:00
    mike163
        1
    mike163  
       2015-07-22 20:51:52 +08:00
    刚用ruby 写了一个 ta是一个ip addr list


    def merge_ip_list(ta)
    nta = ta.map do |h|
    na = (h[:ip].scan /[0-9]+\./)
    na[0]+na[1]+na[2]+'0/24'
    end

    nta.uniq!

    ra=nta.map do |ip|
    ind = ip.index('0/24')
    s1 = ip[0..ind-1]
    rep_times = ta.count{|h| h[:ip].index(s1)!=nil}
    final = (rep_times>1) ? ip : (ta.find{|h| h[:ip].index(s1)!=nil})[:ip]
    i_counter = (ta.select{|h| h[:ip].index(s1)!=nil}).inject(0) { |mem, var| mem + var[:counter] }
    {:ip=>final,:counter=>i_counter}
    end

    return ra
    end
    julyclyde
        2
    julyclyde  
       2015-07-22 21:30:24 +08:00
    转成32位数字,然后按最长相同原则进行比较合并
    sunchuo
        3
    sunchuo  
       2015-07-22 21:48:16 +08:00
    字典树......。
    leavic
        4
    leavic  
       2015-07-23 00:17:50 +08:00
    str_a='192.168.9.12|192.168.9.24'

    ip_list=str_a.split('|')

    ip_list_left=ip_list[0].split('.')
    ip_list_right=ip_list[1].split('.')

    ip_list_left[3]='0'
    ip_list_right[3]='255'

    ip_left='.'.join(ip_list_left)
    ip_right='.'.join(ip_list_right)

    ip_final=ip_left+'-'+ip_right

    print ip_final

    ===========
    192.168.9.0-192.168.9.255
    leavic
        5
    leavic  
       2015-07-23 00:18:58 +08:00
    朕写代码时就是这么粗暴的男子
    leavic
        6
    leavic  
       2015-07-23 00:19:45 +08:00
    至于去除重复,用集合就可以了。
    gock
        7
    gock  
    OP
       2015-07-23 08:48:04 +08:00
    求一个完整的代码,没写出来,大神去哪了
    yuankui
        8
    yuankui  
       2015-07-23 09:05:25 +08:00
    先把ip转化成一个int32,然后去掉后一个字节变成int24,然后一个hashset就可以直接放了把...
    mike163
        9
    mike163  
       2015-07-23 17:36:30 +08:00
    完整的代码:
    def merge_ip_list(s)

    ta = s.split('|')

    nta = ta.map do |h|
    na = (h.scan /[0-9]+\./)
    na[0]+na[1]+na[2]+'0-'+ na[0]+na[1]+na[2]+'255'
    end

    nta.uniq!
    nta.each {|x| p x}

    end

    -----------------
    测试:
    merge_ip_list('192.168.2.1|192.168.2.9|192.168.3.1')
    "192.168.2.0-192.168.2.255"
    "192.168.3.0-192.168.3.255"
    Lumuy
        10
    Lumuy  
       2015-07-24 07:28:46 +08:00
    awk -F '|' '!a[$0]++' file
    gordonFreeman
        11
    gordonFreeman  
       2015-07-24 11:12:19 +08:00
    2个类似的方法
    merge_ip_list 是 @leavic 的方法

    ########################################
    #-*- coding:utf-8 -*-
    from sets import Set

    def merge_ip_list(ip_array):
    ip_list = ip_array.split('|')
    full_list = Set([])
    for ip in ip_list:
    ip_L = ip.split('.')
    ip_L[3] = '0'
    ip_R = ip.split('.')
    ip_R[3] = '255'
    full_list.add('%s - %s' % ('.'.join(ip_L), '.'.join(ip_R)))
    return full_list

    def merge_ip_list_2(ip_array):
    full_list = Set([])
    ip_list_splited = [x.split('.') for x in ip_array.split('|')]
    for ip in ip_list_splited:
    ip_head = '%s.%s.%s' % (ip[0], ip[1], ip[2])
    full_list.add('%s.0 - %s.255' % (ip_head, ip_head))
    return full_list
    #########################################

    ip_array = '192.17.23.3|192.16.80.209|192.16.80.200'
    print merge_ip_list(ip_array)
    print merge_ip_list_2(ip_array)

    2个方法皆返回:
    Set(['192.16.80.0 - 192.16.80.255', '192.17.23.0 - 192.17.23.255'])
    gordonFreeman
        12
    gordonFreeman  
       2015-07-24 11:13:02 +08:00
    药丸,whitespace没了
    mike163
        13
    mike163  
       2015-07-24 22:00:43 +08:00
    再来:
    s='192.168.2.1|192.168.2.9|192.168.3.1'

    s.split('|').map {|h| ts=h.scan(/[0-9]+\.[0-9]+\.[0-9]+\./)[0]; ts+'0-'+ts+'255' }.uniq.each {|x| p x}

    结果:
    "192.168.2.0-192.168.2.255"
    "192.168.3.0-192.168.3.255"
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1438 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:29 · PVG 01:29 · LAX 09:29 · JFK 12:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.