Skip to content

Instantly share code, notes, and snippets.

@ymakino
Last active June 21, 2023 03:02
Show Gist options
  • Save ymakino/21a8c8bed7b89854ea224557d6882ea2 to your computer and use it in GitHub Desktop.
Save ymakino/21a8c8bed7b89854ea224557d6882ea2 to your computer and use it in GitHub Desktop.
An IPv4 address validator in Python. An example of an implementation of a regular expression.
#!/usr/bin/env python3
# Regular Expression:
# (0|1[0-9]{0,2}|[2-9][0-9]?|2[0-4]?[0-9]|25[0-5])
# .(0|1[0-9]{0,2}|[2-9][0-9]?|2[0-4]?[0-9]|25[0-5])
# .(0|1[0-9]{0,2}|[2-9][0-9]?|2[0-4]?[0-9]|25[0-5])
# .(0|1[0-9]{0,2}|[2-9][0-9]?|2[0-4]?[0-9]|25[0-5])
import sys
INIT = 0x00
ACCEPTS = [ num for num in range(0x31, 0x3c + 1) ]
TRANS = {}
for d in range(4):
dd = 0x10 * d
TRANS[0x99] = {}
for i in range(256):
TRANS[0x99][chr(i)] = 0x99
for s in range(0x0d):
ss = s + dd
TRANS[ss] = {}
for i in range(0, 256):
TRANS[ss][chr(i)] = 0x99
for d in range(4):
dd = 0x10 * d
TRANS[0x00 + dd]['0'] = 0x01 + dd
TRANS[0x00 + dd]['1'] = 0x02 + dd
TRANS[0x00 + dd]['2'] = 0x03 + dd
for c in ['3', '4', '5', '6', '7', '8', '9']:
TRANS[0x00 + dd][c] = 0x04 + dd
for c in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
TRANS[0x02 + dd][c] = 0x05 + dd
for c in ['0', '1', '2', '3', '4']:
TRANS[0x03 + dd][c] = 0x06 + dd
TRANS[0x03 + dd]['5'] = 0x07 + dd
for c in ['6', '7', '8', '9']:
TRANS[0x03 + dd][c] = 0x08 + dd
for c in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
TRANS[0x04 + dd][c] = 0x09 + dd
for c in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
TRANS[0x05 + dd][c] = 0x0a + dd
for c in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
TRANS[0x06 + dd][c] = 0x0b + dd
for c in ['0', '1', '2', '3', '4', '5']:
TRANS[0x07 + dd][c] = 0x0c + dd
if dd != 0x30:
TRANS[0x01 + dd]['.'] = 0x10 + dd
TRANS[0x02 + dd]['.'] = 0x10 + dd
TRANS[0x03 + dd]['.'] = 0x10 + dd
TRANS[0x04 + dd]['.'] = 0x10 + dd
TRANS[0x05 + dd]['.'] = 0x10 + dd
TRANS[0x06 + dd]['.'] = 0x10 + dd
TRANS[0x07 + dd]['.'] = 0x10 + dd
TRANS[0x08 + dd]['.'] = 0x10 + dd
TRANS[0x09 + dd]['.'] = 0x10 + dd
TRANS[0x0a + dd]['.'] = 0x10 + dd
TRANS[0x0b + dd]['.'] = 0x10 + dd
TRANS[0x0c + dd]['.'] = 0x10 + dd
def validate(s):
state = INIT
for c in s:
print(f'{state:02x} -({c})-> {TRANS[state][c]:02x}')
state = TRANS[state][c]
print(f'{s}: {state in ACCEPTS}({state:02x})')
if __name__ == '__main__':
for s in sys.argv[1:]:
validate(s)
@ymakino
Copy link
Author

ymakino commented Jun 21, 2023

Regular Expression: D.D.D.D (where D is (0|1[0-9]{0,2}|[2-9][0-9]?|2[0-4]?[0-9]|25[0-5]))

ipv4_validator

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