Last active
June 14, 2021 07:43
-
-
Save 112buddyd/25b538c3f590fa661989af9a96b2c755 to your computer and use it in GitHub Desktop.
Python CIDR Notation to Regex Tool
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# CIDR Notation to Regex Tool | |
# Original: http://d.xenowire.net/cidr2regex.php | |
# Converted to Python by 112buddyd | |
def cidr_to_regex(cidr): | |
import re | |
# Validation | |
cidr_regex = r'^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$' | |
if not re.match(cidr_regex, cidr): | |
return 'Input not valid CIDR notation. Ex. 192.168.1.0/24' | |
# Setup Regex string dictionary | |
map = {} | |
# 255 | |
map[0] = {} | |
map[0][0] = '[0-9]{1,3}' | |
# 128 | |
map[1] = {} | |
map[1][0] = '([0-9]{0,1}[0-9]|1[0-1][0-9]|12[0-7])' | |
map[1][128] = '(12[8-9]|1[3-9][0-9]|2[0-5][0-9])' | |
# 64 | |
map[2] = {} | |
map[2][0] = '([0-5]{0,1}[0-9]|6[0-3])' | |
map[2][64] = '(6[4-9]|[7-9][0-9]|1[0-1][0-9]|12[0-7])' | |
map[2][128] = '(12[8-9]|1[3-8][0-9]|19[0-1])' | |
map[2][192] = '(19[2-9]|2[0-5][0-9])' | |
# 32 | |
map[3] = {} | |
map[3][0] = '([0-2]{0,1}[0-9]|3[0-1])' | |
map[3][32] = '(3[2-9]|[4-5][0-9]|6[0-3])' | |
map[3][64] = '(6[4-9]|[7-8][0-9]|9[0-5])' | |
map[3][96] = '(9[6-9]|1[0-1][0-9]|12[0-7])' | |
map[3][128] = '(12[8-9]|1[3-5][0-9])' | |
map[3][160] = '(1[6-8][0-9]|19[0-1])' | |
map[3][192] = '(19[2-9]|2[0-1][0-9]|22[0-3])' | |
map[3][224] = '(22[4-9]|2[3-5][0-9])' | |
# 16 | |
map[4] = {} | |
map[4][0] = '([0-9]|1[0-5])' | |
map[4][16] = '(1[6-9]|2[0-9]|3[0-1])' | |
map[4][32] = '(3[2-9]|4[0-7])' | |
map[4][48] = '(4[8-9]|5[0-9]|6[0-3])' | |
map[4][64] = '(6[4-9]|7[0-9])' | |
map[4][80] = '(8[0-9]|9[0-5])' | |
map[4][96] = '(9[6-9]|10[0-9]|11[0-1])' | |
map[4][112] = '(11[2-9]|12[0-7])' | |
map[4][128] = '(12[8-9]|13[0-9]|14[0-3])' | |
map[4][144] = '(14[4-9]|15[0-9])' | |
map[4][160] = '(16[0-9]|17[0-5])' | |
map[4][176] = '(17[6-9]|18[0-9]|19[0-1])' | |
map[4][192] = '(19[2-9]|20[0-7])' | |
map[4][208] = '(20[8-9]|21[0-9]|22[0-3])' | |
map[4][224] = '(22[4-9]|23[0-9])' | |
map[4][240] = '2[4-5][0-9]' | |
# 8 | |
map[5] = {} | |
map[5][0] = '[0-7]' | |
map[5][8] = '([8-9]|1[0-5])' | |
map[5][16] = '(1[6-9]|2[0-3])' | |
map[5][24] = '(2[4-9]|3[0-1])' | |
map[5][32] = '3[2-9]' | |
map[5][40] = '4[0-7]' | |
map[5][48] = '(4[8-9]|5[0-5])' | |
map[5][56] = '(5[6-9]|6[0-3])' | |
map[5][64] = '(6[4-9]|7[0-1])' | |
map[5][72] = '7[2-9]' | |
map[5][80] = '8[0-7]' | |
map[5][88] = '(8[8-9]|9[0-5])' | |
map[5][96] = '(9[6-9]|10[0-3])' | |
map[5][104] = '(10[4-9]|11[0-1])' | |
map[5][112] = '11[2-9]' | |
map[5][120] = '12[0-7]' | |
map[5][128] = '(12[8-9]|13[0-5])' | |
map[5][136] = '(13[6-9]|14[0-3])' | |
map[5][144] = '(14[4-9]|15[0-1])' | |
map[5][152] = '15[2-9]' | |
map[5][160] = '16[0-7]' | |
map[5][168] = '(16[8-9]|17[0-5])' | |
map[5][176] = '(17[6-9]|18[0-3])' | |
map[5][184] = '(18[4-9]|19[0-1])' | |
map[5][192] = '19[2-9]' | |
map[5][200] = '20[0-7]' | |
map[5][208] = '(20[8-9]|21[0-5])' | |
map[5][216] = '(21[6-9]|22[0-3])' | |
map[5][224] = '(22[4-9]|23[0-1])' | |
map[5][232] = '23[2-9]' | |
map[5][240] = '24[0-7]' | |
map[5][248] = '(24[8-9]|25[0-5])' | |
# 4 | |
map[6] = {} | |
map[6][0] = '[0-3]' | |
map[6][4] = '[4-7]' | |
map[6][8] = '([8-9]|1[0-1])' | |
map[6][12] = '1[2-5]' | |
map[6][16] = '1[6-9]' | |
map[6][20] = '2[0-3]' | |
map[6][24] = '2[4-7]' | |
map[6][28] = '(2[8-9]|3[0-1])' | |
map[6][32] = '3[2-5]' | |
map[6][36] = '3[6-9]' | |
map[6][40] = '4[0-3]' | |
map[6][44] = '4[4-7]' | |
map[6][48] = '(4[8-9]|5[0-1])' | |
map[6][52] = '5[2-5]' | |
map[6][56] = '5[6-9]' | |
map[6][60] = '6[0-3]' | |
map[6][64] = '6[4-7]' | |
map[6][68] = '(6[8-9]|7[0-1])' | |
map[6][72] = '7[2-5]' | |
map[6][76] = '7[6-9]' | |
map[6][80] = '8[0-3]' | |
map[6][84] = '8[4-7]' | |
map[6][88] = '(8[8-9]|9[0-1])' | |
map[6][92] = '9[2-5]' | |
map[6][96] = '9[6-9]' | |
map[6][100] = '10[0-3]' | |
map[6][104] = '10[4-7]' | |
map[6][108] = '(10[8-9]|11[0-1])' | |
map[6][112] = '11[2-5]' | |
map[6][116] = '11[6-9]' | |
map[6][120] = '12[0-3]' | |
map[6][124] = '12[4-7]' | |
map[6][128] = '(12[8-9]|13[0-1])' | |
map[6][132] = '13[2-5]' | |
map[6][136] = '13[6-9]' | |
map[6][140] = '14[0-3]' | |
map[6][144] = '14[4-7]' | |
map[6][148] = '(14[8-9]|15[0-1])' | |
map[6][152] = '15[2-5]' | |
map[6][156] = '15[6-9]' | |
map[6][160] = '16[0-3]' | |
map[6][164] = '16[4-7]' | |
map[6][168] = '(16[8-9]|17[0-1])' | |
map[6][172] = '17[2-5]' | |
map[6][176] = '17[6-9]' | |
map[6][180] = '18[0-3]' | |
map[6][184] = '18[4-7]' | |
map[6][188] = '(18[8-9]|19[0-1])' | |
map[6][192] = '19[2-5]' | |
map[6][196] = '19[6-9]' | |
map[6][200] = '20[0-3]' | |
map[6][204] = '20[4-7]' | |
map[6][208] = '(20[8-9]|21[0-1])' | |
map[6][212] = '21[2-5]' | |
map[6][216] = '21[6-9]' | |
map[6][220] = '22[0-3]' | |
map[6][224] = '22[4-7]' | |
map[6][228] = '(22[8-9]|23[0-1])' | |
map[6][232] = '23[2-5]' | |
map[6][236] = '23[6-9]' | |
map[6][240] = '24[0-3]' | |
map[6][244] = '24[4-7]' | |
map[6][248] = '(24[8-9]|25[0-1])' | |
map[6][252] = '25[2-5]' | |
# Setup some vars | |
network = cidr.split('/')[0] | |
n1 = network.split('.')[0] | |
n2 = network.split('.')[1] | |
n3 = network.split('.')[2] | |
n4 = network.split('.')[3] | |
mask = cidr.split('/')[1] | |
bip = 0 | |
# Logic based on subnet mask | |
if mask == '0': | |
return map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '1': | |
bip = int((int(n1)/128)*128) | |
map[1][bip] + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '2': | |
bip = int((int(n1)/64)*64) | |
return map[2][bip] + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '3': | |
bip = int((int(n1)/32)*32) | |
return map[3][bip] + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '4': | |
bip = int((int(n1)/16)*16) | |
return map[4][bip] + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '5': | |
bip = int((int(n1)/8)*8) | |
return map[5][bip] + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '6': | |
bip = int((int(n1)/4)*4) | |
return map[6][bip] + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '7': | |
bip = int((int(n1)/2)*2) | |
if len(str(bip)) == 2: | |
return str(bip)[0] + '[' + str(bip)[1] + '-' + str(bip+1)[1] + ']' + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif len(str(bip)) == 3: | |
return str(bip)[:2] + '[' + str(bip)[2] + '-' + str(bip+1)[2] + ']' + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
else: | |
return '[' + str(bip) + '-' + str(bip+1) + ']' + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '8': | |
return n1 + '\.' + map[0][0] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '9': | |
bip = int((int(n2)/128)*128) | |
return n1 + '\.' + map[1][bip] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '10': | |
bip = int((int(n2)/64)*64) | |
return n1 + '\.' + map[2][bip] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '11': | |
bip = int((int(n2)/32)*32) | |
return n1 + '\.' + map[3][bip] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '12': | |
bip = int((int(n2)/16)*16) | |
return n1 + '\.' + map[4][bip] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '13': | |
bip = int((int(n2)/8)*8) | |
return n1 + '\.' + map[5][bip] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '14': | |
bip = int((int(n2)/4)*4) | |
return n1 + '\.' + map[6][bip] + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '15': | |
bip = int((int(n2)/2)*2) | |
if len(str(bip)) == 2: | |
return n1 + '\.' + str(bip)[0] + '[' + str(bip)[1] + '-' + str(bip+1)[1] + ']' + '\.' + map[0][0] + '\.' + map[0][0] | |
elif len(str(bip)) == 3: | |
return n1 + '\.' + str(bip)[:2] + '[' + str(bip)[2] + '-' + str(bip+1)[2] + ']' + '\.' + map[0][0] + '\.' + map[0][0] | |
else: | |
return n1 + '\.' + '[' + str(bip) + '-' + str(bip+1) + ']' + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '16': | |
return n1 + '\.' + n2 + '\.' + map[0][0] + '\.' + map[0][0] | |
elif mask == '17': | |
bip = int((int(n3)/128)*128) | |
return n1 + '\.' + n2 + '\.' + map[1][bip] + '\.' + map[0][0] | |
elif mask == '18': | |
bip = int((int(n3)/64)*64) | |
return n1 + '\.' + n2 + '\.' + map[2][bip] + '\.' + map[0][0] | |
elif mask == '19': | |
bip = int((int(n3)/32)*32) | |
return n1 + '\.' + n2 + '\.' + map[3][bip] + '\.' + map[0][0] | |
elif mask == '20': | |
bip = int((int(n3)/16)*16) | |
return n1 + '\.' + n2 + '\.' + map[4][bip] + '\.' + map[0][0] | |
elif mask == '21': | |
bip = int((int(n3)/8)*8) | |
return n1 + '\.' + n2 + '\.' + map[5][bip] + '\.' + map[0][0] | |
elif mask == '22': | |
bip = int((int(n3)/4)*4) | |
return n1 + '\.' + n2 + '\.' + map[6][bip] + '\.' + map[0][0] | |
elif mask == '23': | |
bip = int((int(n3)/2)*2) | |
if len(str(bip)) == 2: | |
return n1 + '\.' + n2 + '\.' + str(bip)[0] + '[' + str(bip)[1] + '-' + str(bip+1)[1] + ']' + '\.' + map[0][0] | |
elif len(str(bip)) == 3: | |
return n1 + '\.' + n2 + '\.' + str(bip)[:2] + '[' + str(bip)[2] + '-' + str(bip+1)[2] + ']' + '\.' + map[0][0] | |
else: | |
return n1 + '\.' + n2 + '\.' + '[' + str(bip) + '-' + str(bip+1) + ']' + '\.' + map[0][0] | |
elif mask == '24': | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[0][0] | |
elif mask == '25': | |
bip = int((int(n4)/128)*128) | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[1][bip] | |
elif mask == '26': | |
bip = int((int(n4)/64)*64) | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[2][bip] | |
elif mask == '27': | |
bip = int((int(n4)/32)*32) | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[3][bip] | |
elif mask == '28': | |
bip = int((int(n4)/16)*16) | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[4][bip] | |
elif mask == '29': | |
bip = int((int(n4)/8)*8) | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[5][bip] | |
elif mask == '30': | |
bip = int((int(n4)/4)*4) | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[6][bip] | |
elif mask == '31': | |
bip = int((int(n4)/2)*2) | |
if len(str(bip)) == 2: | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + str(bip)[0] + '[' + str(bip)[1] + '-' + [string](bip+1)[1] + ']' | |
elif len(str(bip)) == 3: | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + str(bip)[:2] + '[' + str(bip)[2] + '-' + [string](bip+1)[2] + ']' | |
else: | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + '[' + str(bip) + '-' + str(bip+1) + ']' | |
elif mask == '32': | |
return n1 + '\.' + n2 + '\.' + n3 + '\.' + n4 | |
else: | |
return 'Invalid Subnet Mask.' | |
if __name__ == '__main__': | |
print('RegEx: ' + cidr_to_regex(input('CIDR: '))) |
My guess would to replace
[string]
withstr
[string](bip+1)[2]
-> str(bip+1)[2]
will not work either.
After replacing [string]
with str
(as in having str(bip+1)[2]
in line 283) works great for me, except for a bug in line 279 (which seems like a recurring bug in all of the bip = int((int(n4) / X) * X)
that gets the last bit wrong. It should be bip = int((int(n4) / X)) * X
(X being a different power of 2 in every instance).
Once I changed [string]
to str
and line 279 to bip = int((int(n4) / 2)) * 2
, I got the same results for my CIDR as this website gave me: https://www.ipaddressguide.com/cidr.
@Raznak - do you have an example for which it doesn't work after those changes?
@ewino Well seen. This should do it :)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
My guess would to replace
[string]
withstr