正则表达式 之 子网掩码mask 一篇就搞定

正则表达式: 

pattern = '^((128|192)|2(24|4[08]|5[245]))(\.(0|(128|192)|2((24)|(4[08])|(5[245])))){3}$'

Python 函数例子: 

import re
def check_mask(mask_str):
    pattern = '^((128|192)|2(24|4[08]|5[245]))(\.(0|(128|192)|2((24)|(4[08])|(5[245])))){3}$'
    res = re.match(pattern, mask_str)
    if not res:
        return False
    return True
    

你拷贝过去就完事了,可能不会再刨根问底了。那为什么是这样写?你想过吗?

正则表达式,见 https://blog.csdn.net/u012219045/article/details/98599548

子网掩码, 见 https://blog.csdn.net/u012219045/article/details/60466352 或者 百度百科 也非常详细 https://baike.baidu.com/item/%E5%AD%90%E7%BD%91%E5%88%92%E5%88%86/5446046?fr=aladdin

子网划分:是通过借用IP地址中若干位主机地址来充当子网的网络地址,从而将原网络划分为若干子网。

C类子网掩码 举例:

① 划分子网数 ② 子网位数 ③子网掩码(二进制) ④ 子网掩码(十进制) ⑤ 每个子网主机数

① 1~2        ② 1   ③ 11111111.11111111.11111111.10000000   ④ 255.255.255.128   ⑤ 126

① 3~4        ② 2   ③ 11111111.11111111.11111111.11000000   ④ 255.255.255.192   ⑤ 62

① 5~8        ② 3   ③ 11111111.11111111.11111111.11100000   ④ 255.255.255.224    ⑤ 30

① 9~16      ② 4   ③ 11111111.11111111.11111111.11110000    ④ 255.255.255.240   ⑤ 14

① 17~32    ② 5   ③ 11111111.11111111.11111111.11111000    ④ 255.255.255.248    ⑤ 6

① 33~64    ② 6   ③ 11111111.11111111.11111111.11111100    ④ 255.255.255.252     ⑤ 2

借位:从左到右借的,不是从右到左,所以只能是 128,192,224,240,248,252,254,255。但在这里 254,255 没啥意义,因为每个子网中,第一个IP地址(即主机部分全部为0的IP)和最后一个IP(即主机部分全部为1的IP)不能分配给主机使用。

所以 B类子网掩码 来说,只能是下面的几个:

255.255.0.0

255.255.128.0

255.255.192.0

255.255.224 .0

255.255.240.0

255.255.248.0

255.255.252.0

255.255.254.0

255.255.255.0

255.255.255.128

255.255.255.192

255.255.255.224

255.255.255.240

255.255.255.248

255.255.255.252

A类子网掩码:

255.0.0.0

255.128.0.0

255.192.0.0

255.224.0.0

255.240.0.0

255.248.0.0

255.252.0.0

255.254.0.0

255.255.0.0

255.255.128.0

255.255.192.0

255.255.224 .0

255.255.240.0

255.255.248.0

255.255.252.0

255.255.254.0

255.255.255.0

255.255.255.128

255.255.255.192

255.255.255.224

255.255.255.240

255.255.255.248

255.255.255.252

下图来自百度文档 https://wenku.baidu.com/view/6632813bee06eff9aff80705.html 

CIDR 格式的IP段 输出 字符串格式的子网掩码:

例如: 192.168.1.1/24 的子网掩码是 255.255.255.0

def exchange_maskint(mask_int):
    bin_arr = ['0' for i in range(32)]
    for i in range(mask_int):
        bin_arr[i] = '1'
    tmpmask = [''.join(bin_arr[i * 8:i * 8 + 8]) for i in range(4)]
    tmpmask = [str(int(tmpstr, 2)) for tmpstr in tmpmask]
    return '.'.join(tmpmask)

def get_mask(cidr):
    mask = cidr.split("/")[1]
    return exchange_maskint(int(mask))

print(get_mask('192.168.1.1/24'))

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用Python的re模块中的正则表达式来判断二进制子网掩码的合法性。以下是一个示例代码: ```python import re def is_binary_subnet_mask(mask): # 使用正则表达式匹配是否为二进制数 if not re.match(r'^[01]{32}$', mask): return False # 判断是否为连续的1 if not re.match(r'^1*0*$', mask): return False return True ``` 在上面的代码中,我们首先使用正则表达式 `^[01]{32}$` 来匹配一个32位的二进制数。然后,使用正则表达式 `^1*0*$` 来判断是否为连续的1和后面跟着连续的0,这是一个二进制子网掩码的特征。 使用示例: ```python >>> is_binary_subnet_mask('11111111111111111111111100000000') True >>> is_binary_subnet_mask('11111111111111111111111110000000') False >>> is_binary_subnet_mask('11111111111111111111111111111111') False >>> is_binary_subnet_mask('10000000111111111111111111111111') False ``` ### 回答2: 在Python中,可以使用正则表达式判断二进制子网掩码的合法性。二进制子网掩码是一个32位的二进制数,表示IP地址中网络部分和主机部分的划分。 由于二进制子网掩码的规则非常具体,可以用正则表达式来匹配并判断其合法性。 先定义以下二进制子网掩码的合法规则: 1. 二进制子网掩码必须是32位的二进制数; 2. 子网掩码的网络部分必须连续地由“1”构成,主机部分必须连续地由“0”构成; 3. 子网掩码的网络部分和主机部分的交界处可以由“0”或者由“1”组成。 根据上述规则,可以使用如下正则表达式来判断一个二进制子网掩码的合法性: ```python import re def is_valid_subnet_mask(binary_mask): pattern = r"^(1{1,32})|(0{1,32})$" result = re.match(pattern, binary_mask) if result: return True else: return False ``` 在代码中,使用了正则表达式的匹配方法`re.match()`来判断输入的二进制子网掩码是否满足规则。其中,正则表达式的`^`表示开头,`$`表示结尾,`1{1,32}`表示1可以重复1到32次,`0{1,32}`表示0可以重复1到32次。 通过调用`is_valid_subnet_mask`函数并传入二进制子网掩码,即可判断该子网掩码的合法性。如果返回值为True,则该二进制子网掩码合法;如果返回值为False,则该子网掩码不合法。 这样,我们就可以使用正则表达式来判断一个二进制子网掩码的合法性了。 ### 回答3: Python中可以使用正则表达式来判断二进制子网掩码的合法性。正则表达式是一种字符串匹配的工具,可以用来验证特定的模式是否存在于文本中。 下面是一个使用正则表达式判断二进制子网掩码合法性的示例代码: ```python import re def is_valid_subnet_mask(subnet_mask): pattern = r'^(([01]{8})\.){3}([01]{8})$' # 匹配一个由四个八位二进制数字组成的字符串,每个数字之间用点号分隔 if re.match(pattern, subnet_mask): return True else: return False # 测试 subnet_mask1 = '11111111.11111111.11111111.00000000' subnet_mask2 = '11111111.11111111.11110000.00000000' subnet_mask3 = '11111111.11110000.00000000.00000000' subnet_mask4 = '11110000.00000000.00000000.00000000' print(is_valid_subnet_mask(subnet_mask1)) # 输出:True print(is_valid_subnet_mask(subnet_mask2)) # 输出:True print(is_valid_subnet_mask(subnet_mask3)) # 输出:True print(is_valid_subnet_mask(subnet_mask4)) # 输出:True ``` 该代码中,使用了正则表达式的匹配功能来判断传入的字符串是否符合特定的模式。正则表达式的模式包括了四个八位二进制数字,每个数字之间由点号分隔。最终返回True表示合法,返回False表示不合法。 通过这种方式,我们可以使用Python的正则表达式模块re来方便地进行二进制子网掩码合法性的判断。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值