当前位置: 首页 > news >正文

python解析ip范围,判断ip是否在ip范围内

目录

1. 背景

2. 代码使用示例

2.1 分割ip,横杠 (-) 的ip范围

2.2 判断ip在掩码(/)的范围内

2.3 判断ip在横杠(-)的范围内

2.3.1 格式:192.168.1.1-192.168.1.10

2.3.2 格式:192.168.1.1-10

2.3.3 格式 192.168-169.*.*

2.3.4 格式192.168.*.*或192.*.168.*等

3. 其他扩展

3.1 校验是否为ipv4/ipv6

3.2 判断一个网段/前缀是另一个的子网


1. 背景

各种各样的ip范围,ip通配符等等,判断ip是否符合在这些范围内,搜索耗时耗力,整理出来,后续使用直接复制,有更好用的备注留言

2. 代码使用示例

2.1 分割ip,横杠 (-) 的ip范围

#! -*- coding:utf-8 -*def split_ip_range(range):"""处理以下格式分割192.168.1.1-10   拆分成192.168.1.1-192.168.1.10192.168.1-10.*   拆分成192.168.1.*-192.168.10.*192.168-169.*.*  拆分成192.168.*.*-192.169.*.*192-193.168.*.*  拆分成192.168.*.*-193.168.*.*192.168.1.1-10   拆分成192.168.1.1-192.168.1.10192.168.1.1-192.168.1.10   拆分成192.168.1.1-192.168.1.10:param range::return:"""if "-" not in range:raise ValueError("处理不了其他格式的,拜拜")start, end = range.split("-")start_list, end_list = start.split("."), end.split(".")start_lenght = len(start_list)end_lenght = len(end_list)# 暂不简化,逻辑简洁if start_lenght == 1 and end_lenght == 4:ret_start = start_list + end_list[1:]ret_end = end_listelif start_lenght == 2 and end_lenght == 3:ret_start = start_list + end_list[1:]ret_end = start_list[:1] + end_listelif start_lenght == 3 and end_lenght == 2:ret_start = start_list + end_list[1:]ret_end = start_list[:2] + end_listelif start_lenght == 4 and end_lenght == 1:ret_start = start_list + end_list[1:]ret_end = start_list[:3] + end_listelif start_lenght == 4 and end_lenght == 4:ret_start = start_listret_end = end_listelse:raise ValueError("处理不了其他格式的,再见")return ",".join(ret_start), ",".join(ret_end)if __name__ == '__main__':# 测试ranges = ["192-193.168.*.*","192.168-169.*.*","192.168.1-10.*","192.168.1.1-10","192.168.1.1-192.168.1.10"]for v in ranges:print(f"{v},拆分后是:{split_ip_range(v)}")

2.2 判断ip在掩码(/)的范围内

import ipaddressdef is_ip_in_cidr(ip, cidr):"""判断一个IP地址是否在一个CIDR掩码范围内。:param ip: 字符串格式的IP地址:param cidr: CIDR格式的网络地址(如 "192.168.1.0/24"):return: 如果IP地址在CIDR范围内返回True,否则返回False"""try:# 创建一个IP地址对象ip_obj = ipaddress.ip_address(ip)# 创建一个网络对象network = ipaddress.ip_network(cidr, strict=False)# 检查IP地址是否在网络范围内return ip_obj in networkexcept ValueError as e:print(f"Error parsing IP or CIDR: {e}")return False# 测试用例
test_cases = [("192.168.1.5", "192.168.1.0/24"),("192.168.1.254", "192.168.1.0/24"),("192.168.2.1", "192.168.1.0/24"),("192.168.1.10", "192.168.1.8/29"),("192.168.1.12", "192.168.1.8/29")
]for ip, cidr in test_cases:print(f"{ip} 是否在 {cidr} 范围内?{is_ip_in_cidr(ip, cidr)}")

2.3 判断ip在横杠(-)的范围内

2.3.1 格式:192.168.1.1-192.168.1.10

支持ipv4, ipv6网段

import ipaddress# 支持ipv4, ipv6
def is_ip_in_range(ip_range_str, ip_address_str):"""判断一个IP地址是否在一个IP段内。参数:ip_range_str (str): IP段,格式为"start_ip-end_ip"。ip_address_str (str): 要检查的IP地址。返回:bool: 如果IP地址在IP段内,返回True;否则返回False。"""try:# 将IP范围字符串拆分为起始IP和结束IPstart_ip, end_ip = ip_range_str.split('-')# 将起始IP和结束IP以及要检查的IP地址转换为IP地址对象start_ip_address = ipaddress.ip_address(start_ip)end_ip_address = ipaddress.ip_address(end_ip)ip_to_check = ipaddress.ip_address(ip_address_str)# 判断IP地址是否在起始IP和结束IP之间return start_ip_address <= ip_to_check <= end_ip_addressexcept Exception as e:# print(f"Error: {e}")return False

2.3.2 格式:192.168.1.1-10

1. 使用2.1的方法分割

2. 使用2.3.1的方法判断

2.3.3 格式 192.168-169.*.*

包含*号的

1. 使用2.1的方法分割

2. 分割后的起始ip,* 做转换

3. 使用2.3.1方法判断

# 开始ip的*换为0
# 结束ip的*换为255ip_range_str = '192.*.1.1-192.*.10.1'  # 2.1方法返回ip_range_str = '192.0.1.1-192.255.10.1'  # 修改
ip_str = '192.168.10.1'
print(is_ip_in_range(ip_range_str, ip_str))

2.3.4 格式192.168.*.*或192.*.168.*等

1. 先如下处理数据

2. 再调用2.3.1方法

ip = "192.168.*.*"start = ip.replace("*", "0")
end = ip.replace("*", "255")
print(f"{start}-{end}")   # 192.0.0.1-192.255.255.1

3. 其他扩展

3.1 校验是否为ipv4/ipv6

import ipaddressdef validate_ip(ip_address: str):"""校验是否为ipv4或ipv6@param ip_address: ip@return:"""try:ipaddress.ip_address(ip_address)return Trueexcept ValueError:return False

3.2 判断一个网段/前缀是另一个的子网

import ipaddressdef is_subnet_of(a, b):"""Returns True if network a is a subnet of network b.网络a是网络b的子网,返回true@param a: 子网@param b: 父网@return:  bool"""try:# 将前缀转换为IP网络对象a_network = ipaddress.ip_network(a, strict=True)b_network = ipaddress.ip_network(b, strict=True)return (a_network.network_address >= b_network.network_address anda_network.broadcast_address <= b_network.broadcast_address)except Exception as e:print(e)return False

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Codeforces Round 889 (Div. 2) B. Longest Divisors Interval
  • Charles mac电脑配置
  • 区块链之变:揭秘Web3对互联网的改变
  • lvs-nat模式实验详解
  • 服务器数据恢复—Linux操作系统环境下网站数据的恢复案例
  • 【电脑组装】✈️从配置拼装到安装系统组装自己的台式电脑
  • Git 中的refs
  • I2C/IIC学习笔记
  • C++ 科目二 [const_cast]
  • AI健身体能测试之基于paddlehub实现引体向上计数个数统计
  • C++——内存管理
  • 828华为云征文|部署知识库问答系统 MaxKB
  • Sqlserver常用sql
  • list从0到1的突破
  • Guava中Preconditions校验
  • 《Java编程思想》读书笔记-对象导论
  • Android 架构优化~MVP 架构改造
  • Angular 响应式表单 基础例子
  • AngularJS指令开发(1)——参数详解
  • ECS应用管理最佳实践
  • HTTP 简介
  • js对象的深浅拷贝
  • nodejs:开发并发布一个nodejs包
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 搞机器学习要哪些技能
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 每天10道Java面试题,跟我走,offer有!
  • 温故知新之javascript面向对象
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • !!Dom4j 学习笔记
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)我也是一只IT小小鸟
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET 设计一套高性能的弱事件机制
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .NET关于 跳过SSL中遇到的问题
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @property括号内属性讲解
  • @Resource和@Autowired的区别
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [20150321]索引空块的问题.txt
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [Angular 基础] - 数据绑定(databinding)
  • [C#学习笔记]注释
  • [C\C++]读入优化【技巧】
  • [C++]——带你学习类和对象
  • [IE编程] 如何设置IE8的WebBrowser控件(MSHTML) 的渲染模式
  • [iOS]随机生成UUID通用唯一识别码