python 将CIDR表示法转换为正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 将CIDR表示法转换为正则表达式相关的知识,希望对你有一定的参考价值。

#!/usr/bin/python
''' Not my script, found on the Internet, and rediscovered on my hard drive
'''
import sys

def cidr_to_regex(cidr):
    ip, prefix = cidr.split('/')

    base = 0
    for val in map(int, ip.split('.')):
        base = (base << 8) | val

    shift = 32 - int(prefix)
    start = base >> shift << shift
    end = start | (1 << shift) - 1

    def regex(lower, upper):
        if lower == upper:
            return str(lower)

        from math import log10
        exp = int(log10(upper - lower))
        delta = 10 ** exp

        if lower == 0 and upper == 255:
            return "\d+"

        if delta == 1:
            val = ""
            for a, b in zip(str(lower), str(upper)):
                if a == b:
                    val += str(a)
                elif (a, b) == ("0", "9"):
                    val += '\d'
                elif int(b) - int(a) == 1:
                    val += '[%s%s]' % (a, b)
                else:
                    val += '[%s-%s]' % (a, b)
            return val

        def gen_classes():
            floor_ = lambda x: int(round(x / delta, 0) * delta)

            xs = range(floor_(upper) - delta, floor_(lower), -delta)
            for x in map(str, xs):
                yield '%s%s' % (x[:-exp], r'\d' * exp)

            yield regex(lower, floor_(lower) + (delta - 1))
            yield regex(floor_(upper), upper)

        return '|'.join(gen_classes())

    def get_parts():
        for x in range(24, -1, -8):
            yield regex(start >> x & 255, end >> x & 255)

    return '^%s$' % r'\.'.join(get_parts())

for line in sys.stdin.readlines():
	print cidr_to_regex( line )
	print

以上是关于python 将CIDR表示法转换为正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

CIDR 表示法中 IPV6 地址的正则表达式

csharp 将子网掩码v4转换为CIDR(int)表示法

csharp 简单的C#扩展方法,将驼峰大小写字符串转换为下划线表示法而不使用任何正则表达式

使用 django 将 Python 正则表达式转换为路径时遇到问题

使用正则表达式将python中的字符串中的布尔真转换为真[重复]

Python中的IP地址列表到CIDR列表