Python 分解IP段获取所有IP(子网掩码)

需求

192.168.1.0/24,192.168.2.1-192.168.2.254,192.168.3.3

IP段格式已 "," 分割,获取所有IP

注意

1. 判断 IP 是否合规

2. 去除多余的字符,例如空格、换行符

3. 去重

代码

import re
import ipaddress


def isIP(ip):
    p = re.compile('^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$')
    if p.match(ip):
        return True
    else:
        return False

def get_ip_last(ip):
    parts = ip.split(".")
    last_octet = int(parts[3])
    return last_octet

def range_to_ips(mask):
    try:
        ip_list = []
        ips = mask.split("-", 1)
        start_ip = ips[0]
        end_ip = ips[1]

        last_octet = get_ip_last(start_ip)
        if last_octet <= 0 or last_octet >= 255:
            return False
        last_octet = get_ip_last(end_ip)
        if last_octet <= 0 or last_octet >= 255:
            return False

        start = ipaddress.IPv4Address(start_ip)
        end = ipaddress.IPv4Address(end_ip)
        for ip in range(int(start), int(end) + 1):
            ip_tmp = ipaddress.IPv4Address(ip)
            ip_list.append(str(ip_tmp))
    except Exception as e:
        return False
    return ip_list

def ip_segment_to_ips(ip_segment):
    ip_list = []
    ip_segment = ip_segment.strip()
    ip_tmp = ip_segment.split(",")
    for ip_range in ip_tmp:
        if "/" in ip_range:
            ips = mask_to_ips(ip_range)
            if not ips:
                return False
            else:
                ip_list.extend(ips)
        elif "-" in ip_range:
            ips = range_to_ips(ip_range)
            if not ips:
                return False
            else:
                ip_list.extend(ips)
        elif isIP(ip_range):
            ip_list.append(ip_range)
        else:
            pass

    ip_list = list(set(ip_list))
    print(ip_list, len(ip_list))
    return ip_list


if __name__ == '__main__':
    ip_segment = "192.168.1.0/24,192.168.2.1-192.168.2.254,192.168.3.3"
    print(ip_segment_to_ips(ip_segment))

执行结果

list中

猜你喜欢

转载自blog.csdn.net/u012206617/article/details/134673481