【Python】IP地址解析并生成

IP地址解析并生成

#!python3
# coding=utf-8
import logging
import ipaddress


logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s [%(filename)s:%(lineno)d] %(levelname)s # %(message)s',
                    datefmt='%Y-%m-%d %M:%S')

def parse_ipaddress_user(addrs, flag):
    addr_fields = str.split(addrs, flag)
    if len(addr_fields) != 2:
        return None, None
    try:
        start = ipaddress.ip_address(addr_fields[0])
    except Exception:
        logging.error("addr err: %s" % addrs)
        return None, None
    try:
        end = ipaddress.ip_address(addr_fields[1])
    except Exception:
        try:
            end_tmp = int(addr_fields[1])
        except Exception:
            logging.error("add err: %s", addrs)
            return None, None
        tmp_fields = str.split(addr_fields[0], ".")
        if len(tmp_fields) != 4:
            logging.error("add err: %s", addrs)
            return None, None
        end_str = f"{tmp_fields[0]}.{tmp_fields[1]}.{tmp_fields[2]}.{end_tmp}"
        try:
            end = ipaddress.ip_address(end_str)
        except Exception:
            logging.error("add err: %s", addrs)
            return None, None
    return start, end


def parse_ipaddress(addrs):
    if "-" in addrs:
        start, end = parse_ipaddress_user(addrs, "-")
        if start is None or end is None:
            yield None
        else:
            while start <= end:
                yield start
                start += 1
    elif "~" in addrs:
        start, end = parse_ipaddress_user(addrs, "~")
        if start is None or end is None:
            yield None
        else:
            while start <= end:
                yield start
                start += 1
    elif "/" in addrs:
        try:
            base_net_addr = ipaddress.ip_network(addrs)
        except Exception:
            logging.error("add err: %s", addrs)
            yield None
        else:
            base_addr = base_net_addr.network_address + 1
            index = 0
            while True:
                ipvx_addr = base_addr + index
                index += 1
                if ipvx_addr >= base_net_addr.broadcast_address:
                    break
                yield ipvx_addr
    else:
        yield addrs


if __name__ == "__main__":
    with open("ipaddr", 'r', encoding='utf-8') as fd:
        for check_someone in fd:
            check_someone = check_someone.strip()
            if check_someone == "":
                continue
            gen_addr_obj = parse_ipaddress(check_someone)
            for gen_addr in gen_addr_obj:
                print(gen_addr)

文件内容格式有:

192.168.1.0/24
192.168.2.1-192.168.2.254
192.168.3.1~192.168.3.100
192.168.4.1-254
192.168.5.100
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值