Skip to content

Instantly share code, notes, and snippets.

@Karthikeyan298
Forked from 112buddyd/cidr_to_regex.py
Created July 3, 2018 13:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Karthikeyan298/edcba4ffc5de5d81cae4cfc593619ef5 to your computer and use it in GitHub Desktop.
Save Karthikeyan298/edcba4ffc5de5d81cae4cfc593619ef5 to your computer and use it in GitHub Desktop.
Python CIDR Notation to Regex Tool
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 = cidr.split('.')[0]
n2 = cidr.split('.')[1]
n3 = cidr.split('.')[2]
n4 = cidr.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)
return 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':
print(n3)
bip = int((int(n3) / 4) * 4)
print(bip)
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.split("/")[0]) / 128) * 128)
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[1][bip]
elif mask == '26':
bip = int((int(n4.split("/")[0]) / 64) * 64)
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[2][bip]
elif mask == '27':
bip = int((int(n4.split("/")[0]) / 32) * 32)
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[3][bip]
elif mask == '28':
bip = int((int(n4.split("/")[0]) / 16) * 16)
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[4][bip]
elif mask == '29':
bip = int((int(n4.split("/")[0]) / 8) * 8)
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[5][bip]
elif mask == '30':
bip = int((int(n4.split("/")[0]) / 4) * 4)
return n1 + '\.' + n2 + '\.' + n3 + '\.' + map[6][bip]
elif mask == '31':
bip = int((int(n4.split("/")[0]) / 2) * 2)
if len(str(bip)) == 2:
return n1 + '\.' + n2 + '\.' + n3 + '\.' + str(bip)[0] + '[' + str(bip)[1] + '-' + str(bip + 1)[
1] + ']'
elif len(str(bip)) == 3:
return n1 + '\.' + n2 + '\.' + n3 + '\.' + str(bip)[:2] + '[' + str(bip)[2] + '-' + str(bip + 1)[
2] + ']'
else:
return n1 + '\.' + n2 + '\.' + n3 + '\.' + '[' + str(bip) + '-' + str(bip + 1) + ']'
elif mask == '32':
return n1 + '\.' + n2 + '\.' + n3 + '\.' + n4.split("/")[0]
else:
return 'Invalid Subnet Mask.'
if __name__ == '__main__':
print(cidr_to_regex("10.11.12.12/24"))
@Karthikeyan298
Copy link
Author

Fixed some bugs in the
https://gist.github.com/Karthikeyan298/edcba4ffc5de5d81cae4cfc593619ef5#file-cidr_to_regex-py-L279
https://gist.github.com/Karthikeyan298/edcba4ffc5de5d81cae4cfc593619ef5#file-cidr_to_regex-py-L282

Changed [string] to str() and also added split to get the last subnet IPs from the given range for masks 25 to 31

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment