Skip to content

Commit 6c7cac9

Browse files
committed
Day 34: use regex matching instead of subset check and combine inequality checks
1 parent ac67360 commit 6c7cac9

File tree

1 file changed

+32
-34
lines changed

1 file changed

+32
-34
lines changed

day34/validateIP.py

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,56 @@
1+
import re
2+
13
def validateIP(ip):
24
ipv4 = ip.split(".")
35
ipv6 = ip.split(":")
4-
if len(ipv4) == 4 and validateIPv4(ipv4):
6+
if len(ipv4) == 4 and isValidIPv4(ip):
57
return "IPv4"
6-
elif len(ipv6) == 8 and validateIPv6(ipv6):
8+
elif len(ipv6) == 8 and isValidIPv6(ip):
79
return "IPv6"
810
else:
911
return "Neither"
1012

11-
def validateIPv4(segments):
12-
digits = set("1234567890")
13-
for s in segments:
14-
# segment too long or too short
15-
if len(s) > 3 or len(s) == 0:
13+
def isValidIPv4(ip):
14+
for s in ip.split("."):
15+
numDigits = len(s)
16+
17+
if not 1 <= numDigits <= 3:
1618
return False
1719

18-
# segment has leading 0
19-
if len(s) > 1 and s[0] == "0":
20+
if s.startswith("0"):
2021
return False
2122

22-
# segment contains non-numeric digits
23-
if not set(s) < digits:
23+
if not re.match("[1234567890]{{{}}}".format(numDigits), s):
2424
return False
2525

26-
# segment is not an int between 0 and 255 inclusive
27-
if int(s) > 255 or int(s) < 0:
26+
if not 0 <= int(s) <= 255:
2827
return False
2928
return True
3029

31-
def validateIPv6(segments):
32-
hexDigits = set("1234567890abcdefABCDEF")
33-
for s in segments:
34-
# segment too long or too short
35-
if len(s) > 4 or len(s) == 0:
30+
def isValidIPv6(ip):
31+
for s in ip.split(":"):
32+
numDigits = len(s)
33+
34+
if not 1 <= numDigits <= 4:
3635
return False
3736

38-
# segment contains non-hexadecimal digits
39-
if not set(s) < hexDigits:
37+
if not re.match("[1234567890abcdefABCDEF]{{{}}}".format(numDigits), s):
4038
return False
4139
return True
4240

43-
def testValidateIPv4():
44-
assert validateIPv4(["172", "16", "254", "1"])
45-
assert not validateIPv4(["172", "16", "254", "01"])
46-
assert not validateIPv4(["172", "16", "256", "1"])
47-
assert not validateIPv4(["1e1", "4", "5", "6"])
48-
assert not validateIPv4(["1e1", "", "5", "6"])
41+
def testIsValidIPv4():
42+
assert isValidIPv4("172.16.254.1")
43+
assert not isValidIPv4("172.16.254.01")
44+
assert not isValidIPv4("172.16.256.1")
45+
assert not isValidIPv4("1e1.4.5.6")
46+
assert not isValidIPv4("1e1..5.6")
4947

50-
def testValidateIPv6():
51-
assert validateIPv6(["2001", "0db8", "85a3", "0000", "0000", "8a2e", "0370", "7334"])
52-
assert validateIPv6(["2001", "db8", "85a3", "0", "0", "8A2E", "0370", "7334"])
53-
assert not validateIPv6(["2001", "0db8", "85a3", "", "", "8A2E", "0370", "7334"])
54-
assert not validateIPv6(["02001", "0db8", "85a3", "0000", "0000", "8a2e", "0370", "7334"])
55-
assert not validateIPv6(["GGGG", "0db8", "85a3", "0000", "0000", "8a2e", "0370", "7334"])
48+
def testIsValidIPv6():
49+
assert isValidIPv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334")
50+
assert isValidIPv6("2001:db8:85a3:0:0:8A2E:0370:7334")
51+
assert not isValidIPv6("2001:0db8:85a3:::8A2E:0370:7334")
52+
assert not isValidIPv6("02001:0db8:85a3:0000:0000:8a2e:0370:7334")
53+
assert not isValidIPv6("GGGG:0db8:85a3:0000:0000:8a2e:0370:7334")
5654

5755
def testValidateIP():
5856
assert validateIP("172.16.254.1") == "IPv4"
@@ -66,8 +64,8 @@ def testValidateIP():
6664
assert validateIP("02001:db8:85a3:0:0:8A2E:0370:7334") == "Neither"
6765

6866
def main():
69-
testValidateIPv4()
70-
testValidateIPv6()
67+
testIsValidIPv4()
68+
testIsValidIPv6()
7169
testValidateIP()
7270

7371
if __name__ == "__main__":

0 commit comments

Comments
 (0)