|
2 | 2 |
|
3 | 3 | from .utils import validator |
4 | 4 |
|
5 | | -ip_middle_octet = u"(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5]))" |
6 | | -ip_last_octet = u"(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))" |
| 5 | +ip_middle_octet = r"(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5]))" |
| 6 | +ip_last_octet = r"(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))" |
7 | 7 |
|
8 | | -regex = re.compile( |
9 | | - u"^" |
| 8 | +regex = re.compile( # noqa: W605 |
| 9 | + r"^" |
10 | 10 | # protocol identifier |
11 | | - u"(?:(?:https?|ftp)://)" |
| 11 | + r"(?:(?:https?|ftp)://)" |
12 | 12 | # user:pass authentication |
13 | | - u"(?:[-a-z\u00a1-\uffff0-9._~%!$&'()*+,;=:]+" |
14 | | - u"(?::[-a-z0-9._~%!$&'()*+,;=:]*)?@)?" |
15 | | - u"(?:" |
16 | | - u"(?P<private_ip>" |
| 13 | + r"(?:[-a-z\u00a1-\uffff0-9._~%!$&'()*+,;=:]+" |
| 14 | + r"(?::[-a-z0-9._~%!$&'()*+,;=:]*)?@)?" |
| 15 | + r"(?:" |
| 16 | + r"(?P<private_ip>" |
17 | 17 | # IP address exclusion |
18 | 18 | # private & local networks |
19 | | - u"(?:(?:10|127)" + ip_middle_octet + u"{2}" + ip_last_octet + u")|" |
20 | | - u"(?:(?:169\.254|192\.168)" + ip_middle_octet + ip_last_octet + u")|" |
21 | | - u"(?:172\.(?:1[6-9]|2\d|3[0-1])" + ip_middle_octet + ip_last_octet + u"))" |
22 | | - u"|" |
| 19 | + r"(?:(?:10|127)" + ip_middle_octet + r"{2}" + ip_last_octet + r")|" |
| 20 | + r"(?:(?:169\.254|192\.168)" + ip_middle_octet + ip_last_octet + r")|" |
| 21 | + r"(?:172\.(?:1[6-9]|2\d|3[0-1])" + ip_middle_octet + ip_last_octet + r"))" |
| 22 | + r"|" |
23 | 23 | # private & local hosts |
24 | | - u"(?P<private_host>" |
25 | | - u"(?:localhost))" |
26 | | - u"|" |
| 24 | + r"(?P<private_host>" |
| 25 | + r"(?:localhost))" |
| 26 | + r"|" |
27 | 27 | # IP address dotted notation octets |
28 | 28 | # excludes loopback network 0.0.0.0 |
29 | 29 | # excludes reserved space >= 224.0.0.0 |
30 | 30 | # excludes network & broadcast addresses |
31 | 31 | # (first & last IP address of each class) |
32 | | - u"(?P<public_ip>" |
33 | | - u"(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])" |
34 | | - u"" + ip_middle_octet + u"{2}" |
35 | | - u"" + ip_last_octet + u")" |
36 | | - u"|" |
| 32 | + r"(?P<public_ip>" |
| 33 | + r"(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])" |
| 34 | + r"" + ip_middle_octet + r"{2}" |
| 35 | + r"" + ip_last_octet + r")" |
| 36 | + r"|" |
37 | 37 | # IPv6 RegEx from https://stackoverflow.com/a/17871737 |
38 | | - u"\[(" |
| 38 | + r"\[(" |
39 | 39 | # 1:2:3:4:5:6:7:8 |
40 | | - u"([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|" |
| 40 | + r"([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|" |
41 | 41 | # 1:: 1:2:3:4:5:6:7:: |
42 | | - u"([0-9a-fA-F]{1,4}:){1,7}:|" |
| 42 | + r"([0-9a-fA-F]{1,4}:){1,7}:|" |
43 | 43 | # 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8 |
44 | | - u"([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|" |
| 44 | + r"([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|" |
45 | 45 | # 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8 |
46 | | - u"([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|" |
| 46 | + r"([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|" |
47 | 47 | # 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8 |
48 | | - u"([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|" |
| 48 | + r"([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|" |
49 | 49 | # 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8 |
50 | | - u"([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|" |
| 50 | + r"([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|" |
51 | 51 | # 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8 |
52 | | - u"([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|" |
| 52 | + r"([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|" |
53 | 53 | # 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8 |
54 | | - u"[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|" |
| 54 | + r"[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|" |
55 | 55 | # ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 :: |
56 | | - u":((:[0-9a-fA-F]{1,4}){1,7}|:)|" |
| 56 | + r":((:[0-9a-fA-F]{1,4}){1,7}|:)|" |
57 | 57 | # fe80::7:8%eth0 fe80::7:8%1 |
58 | 58 | # (link-local IPv6 addresses with zone index) |
59 | | - u"fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|" |
60 | | - u"::(ffff(:0{1,4}){0,1}:){0,1}" |
61 | | - u"((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}" |
| 59 | + r"fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|" |
| 60 | + r"::(ffff(:0{1,4}){0,1}:){0,1}" |
| 61 | + r"((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}" |
62 | 62 | # ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255 |
63 | 63 | # (IPv4-mapped IPv6 addresses and IPv4-translated addresses) |
64 | | - u"(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|" |
65 | | - u"([0-9a-fA-F]{1,4}:){1,4}:" |
66 | | - u"((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}" |
| 64 | + r"(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|" |
| 65 | + r"([0-9a-fA-F]{1,4}:){1,4}:" |
| 66 | + r"((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}" |
67 | 67 | # 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33 |
68 | 68 | # (IPv4-Embedded IPv6 Address) |
69 | | - u"(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])" |
70 | | - u")\]|" |
| 69 | + r"(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])" |
| 70 | + r")\]|" |
71 | 71 | # host name |
72 | 72 | u"(?:(?:[a-z\u00a1-\uffff0-9]-?)*[a-z\u00a1-\uffff0-9]+)" |
73 | 73 | # domain name |
74 | 74 | u"(?:\.(?:[a-z\u00a1-\uffff0-9]-?)*[a-z\u00a1-\uffff0-9]+)*" |
75 | 75 | # TLD identifier |
76 | 76 | u"(?:\.(?:[a-z\u00a1-\uffff]{2,}))" |
77 | | - u")" |
| 77 | + r")" |
78 | 78 | # port number |
79 | | - u"(?::\d{2,5})?" |
| 79 | + r"(?::\d{2,5})?" |
80 | 80 | # resource path |
81 | 81 | u"(?:/[-a-z\u00a1-\uffff0-9._~%!$&'()*+,;=:@/]*)?" |
82 | 82 | # query string |
83 | | - u"(?:\?\S*)?" |
| 83 | + r"(?:\?\S*)?" |
84 | 84 | # fragment |
85 | | - u"(?:#\S*)?" |
86 | | - u"$", |
| 85 | + r"(?:#\S*)?" |
| 86 | + r"$", |
87 | 87 | re.UNICODE | re.IGNORECASE |
88 | 88 | ) |
89 | 89 |
|
|
0 commit comments