规范化IP地址

时间:2012-03-21 17:57:42

标签: java python regex bash

在我开始写自己之前,有人知道可以规范化一组IP地址的库。我管理的应用程序访问基于我们客户提供的一系列IP地址。大多数情况下这个很小,但有时这个列表是1000多个可怕的IP地址。

例如

#INPUT                  #TO             #OUTPUT
192.168.0-10.*          ->        192.168.0.0-192.168.10.255
192.168.15.0-64         ->        192.168.15.0-192.168.15.64
192.10-15.*.*           ->        192.10.0.0-192.15.255.255
192.168.1.1             ->        192.168.1.1-192.168.1.1
#YES, last case needed too, 
#the scripit I have to convert to a CIDR range needs  start and stop

这最好是在python中完成,但java或某种shell脚本也可以。 在病房之后我已经编写了一个脚本来转换为CIDR范围并将它们存储在我们的权限表中。我真的只是尝试每年手动做几次。我认为现在是时候自动化这一点了,只是不想在这里重新发明轮子。这似乎是一个常见的问题

3 个答案:

答案 0 :(得分:2)

javascript中的regexp解决方案(它是windows的控制台语言; - )

function(addr) {
    addr.replace(/(\d+)-(\d+)/, "\$1").replace(/\*/, "0") + '-' +
    addr.replace(/(\d+)-(\d+)/, "\$2").replace(/\*/, "255")
}

python中的功能解决方案(python是我的外语)

pairs = [s == '*' ? (0, 255) : s.split('-')[0,-1] for s in addr.split('.')];
[s[0] for s in pairs].join('.')+'-'+[s[1] for s in pairs].join('.')

你真的考虑过,2行代码费用谷歌搜索,然后询问SO?

答案 1 :(得分:1)

我认为你应该看看Python IP工具:

http://code.google.com/p/python-iptools/

似乎拥有你需要的大部分东西,如果有什么不做的话,你总是可以扩展它....

答案 2 :(得分:1)

这两个答案都很有帮助,但都没有回答我的问题。如果有一个图书馆已经存在这样做了。我还没找到一个。包含一个专注于IP的其他库的方法可能是一种有价值的方法。在询问这个问题之前,我发现了Adam的Iptools。

我的输出确实发生了一些变化。我最终返回了一个CIDR地址,而不是一个范围。一些事情可以简化,并清理干净。一些错误检查也会有所帮助。但这就是我用过的,生锈的蟒蛇和一切。

def normalize(ip):
    if '/' in ip: 
        return [ip]

    ocets = [ocet.replace(' ','') for ocet in ip.split('.')]
    if len(ocets) == 4: ocets += ocets
    if len(ocets) == 7: 
        if (re.search('-',ocets[3])):
            for i,v in enumerate(ocets[3:]):
                if i == 0:
                    last = ocets[4]
                    ocets[3],ocets[4] = ocets[3].split('-')
                else:
                    if 4+i < len(ocets):
                        newVal = last
                        last = ocets[4+i]
                        ocets[4+i] = newVal
                    else: 
                        ocets.append(last)

    if len(ocets) != 8: 
        return 'ERROR WITH: %s not right size %d' % ('.'.join(ocets),len(ocets))
    for i,ocet in enumerate(ocets):
        if (re.search('\*',ocet)): 
            ocets[i] = '0'
            ocets[i+4] = '255'        


        if (re.search('-',ocets[i])): 
            ocets[i],ocets[i+4] = ocets[i].split('-')[0:2]
    newIP = netaddr.iprange_to_cidrs('.'.join(ocets[0:4]) ,'.'.join(ocets[4:]))
    return newIP