1+ import re
2+
13def 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
5755def 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
6866def main ():
69- testValidateIPv4 ()
70- testValidateIPv6 ()
67+ testIsValidIPv4 ()
68+ testIsValidIPv6 ()
7169 testValidateIP ()
7270
7371if __name__ == "__main__" :
0 commit comments