diff options
| author | Bobby <[email protected]> | 2022-11-27 15:36:40 -0500 |
|---|---|---|
| committer | Bobby <[email protected]> | 2022-11-27 15:36:40 -0500 |
| commit | 473c86e0ac00cc479401c40d05ad6cbc10d2cf0d (patch) | |
| tree | cd591dc2a11b005ab17071e3678991cb2800e910 /src | |
| parent | 2076d462ed8c38a1202fd5ca5b20f0e07accbbee (diff) | |
| download | edify-473c86e0ac00cc479401c40d05ad6cbc10d2cf0d.tar.xz edify-473c86e0ac00cc479401c40d05ad6cbc10d2cf0d.zip | |
added zip code validator
Diffstat (limited to 'src')
| -rw-r--r-- | src/edify/library/__init__.py | 1 | ||||
| -rw-r--r-- | src/edify/library/support/zip.py | 1172 | ||||
| -rw-r--r-- | src/edify/library/zip.py | 28 |
3 files changed, 1201 insertions, 0 deletions
diff --git a/src/edify/library/__init__.py b/src/edify/library/__init__.py index f2827ea..d048a8c 100644 --- a/src/edify/library/__init__.py +++ b/src/edify/library/__init__.py @@ -10,3 +10,4 @@ from .mail import email_rfc_5322 from .phone import phone_number from .url import url from .uuid import uuid +from .zip import zip diff --git a/src/edify/library/support/zip.py b/src/edify/library/support/zip.py new file mode 100644 index 0000000..350837f --- /dev/null +++ b/src/edify/library/support/zip.py @@ -0,0 +1,1172 @@ +ZIP_LOCALES = [ + { + "abbrev": "AF", + "name": "Afghanistan", + "zip": "[0-9]{4}" + }, + { + "abbrev": "AL", + "name": "Albania", + "zip": "(120|122)[0-9]{2}" + }, + { + "abbrev": "DZ", + "name": "Algeria", + "zip": "[0-9]{5}" + }, + { + "abbrev": "AS", + "name": "American Samoa", + "zip": "[0-9]{5}" + }, + { + "abbrev": "AD", + "name": "Andorra", + "zip": "[0-9]{5}" + }, + { + "abbrev": "AO", + "name": "Angola" + }, + { + "abbrev": "AI", + "name": "Anguilla", + "zip": "AI-2640" + }, + { + "abbrev": "AG", + "name": "Antigua and Barbuda" + }, + { + "abbrev": "AR", + "name": "Argentina", + "zip": "[A-Z]{1}[0-9]{4}[A-Z]{3}" + }, + { + "abbrev": "AM", + "name": "Armenia", + "zip": "[0-9]{4}" + }, + { + "abbrev": "AW", + "name": "Aruba" + }, + { + "abbrev": "AU", + "name": "Australia", + "zip": "[0-9]{4}" + }, + { + "abbrev": "AT", + "name": "Austria", + "zip": "[0-9]{4}" + }, + { + "abbrev": "AZ", + "name": "Azerbaijan", + "zip": "[0-9]{4}" + }, + { + "abbrev": "BS", + "name": "Bahamas" + }, + { + "abbrev": "BH", + "name": "Bahrain" + }, + { + "abbrev": "BD", + "name": "Bangladesh", + "zip": "[0-9]{4}" + }, + { + "abbrev": "BB", + "name": "Barbados", + "zip": "BB[0-9]{5}" + }, + { + "abbrev": "BY", + "name": "Belarus", + "zip": "[0-9]{6}" + }, + { + "abbrev": "BE", + "name": "Belgium", + "zip": "[0-9]{4}" + }, + { + "abbrev": "BZ", + "name": "Belize" + }, + { + "abbrev": "BJ", + "name": "Benin" + }, + { + "abbrev": "BM", + "name": "Bermuda", + "zip": "[A-Z]{2}[0-9]{2}" + }, + { + "abbrev": "BT", + "name": "Bhutan", + "zip": "[0-9]{5}" + }, + { + "abbrev": "BO", + "name": "Bolivia" + }, + { + "abbrev": "BQ", + "name": "Bonaire" + }, + { + "abbrev": "BA", + "name": "Bosnia and Herzegovina", + "zip": "[0-9]{5}" + }, + { + "abbrev": "BW", + "name": "Botswana" + }, + { + "abbrev": "BR", + "name": "Brazil", + "zip": "[0-9]{5}-[0-9]{3}" + }, + { + "abbrev": "BN", + "name": "Brunei", + "zip": "[A-Z]{2}[0-9]{4}" + }, + { + "abbrev": "BG", + "name": "Bulgaria", + "zip": "[0-9]{4}" + }, + { + "abbrev": "BF", + "name": "Burkina Faso" + }, + { + "abbrev": "BI", + "name": "Burundi" + }, + { + "abbrev": "KH", + "name": "Cambodia", + "zip": "[0-9]{5}" + }, + { + "abbrev": "CM", + "name": "Cameroon" + }, + { + "abbrev": "CA", + "name": "Canada", + "zip": "[A-Z][0-9][A-Z] ?[0-9][A-Z][0-9]" + }, + { + "abbrev": "CI", + "name": "Canary Islands", + "zip": "[0-9]{5}" + }, + { + "abbrev": "CV", + "name": "Cape Verde", + "zip": "[0-9]{4}" + }, + { + "abbrev": "KY", + "name": "Cayman Islands", + "zip": "[A-Z]{2}[0-9]-[0-9]{4}" + }, + { + "abbrev": "CF", + "name": "Central African Republic" + }, + { + "abbrev": "TD", + "name": "Chad" + }, + { + "abbrev": "CI", + "name": "Channel Islands", + "zip": "[A-Z]{2}[0-9]{2}" + }, + { + "abbrev": "CL", + "name": "Chile", + "zip": "[0-9]{7}" + }, + { + "abbrev": "CN", + "name": "China, People's Republic", + "zip": "[0-9]{6}" + }, + { + "abbrev": "CO", + "name": "Colombia", + "zip": "[0-9]{6}" + }, + { + "abbrev": "KM", + "name": "Comoros" + }, + { + "abbrev": "CG", + "name": "Congo" + }, + { + "abbrev": "CD", + "name": "Congo, The Democratic Republic of" + }, + { + "abbrev": "CK", + "name": "Cook Islands" + }, + { + "abbrev": "CR", + "name": "Costa Rica", + "zip": "[0-9]{5}" + }, + { + "abbrev": "CI", + "name": "Côte d'Ivoire" + }, + { + "abbrev": "HR", + "name": "Croatia", + "zip": "[0-9]{5}" + }, + { + "abbrev": "CU", + "name": "Cuba", + "zip": "[0-9]{5}" + }, + { + "abbrev": "CW", + "name": "Curacao" + }, + { + "abbrev": "CY", + "name": "Cyprus", + "zip": "[0-9]{4}" + }, + { + "abbrev": "CZ", + "name": "Czech Republic", + "zip": "[0-9]{3} [0-9]{2}" + }, + { + "abbrev": "DK", + "name": "Denmark", + "zip": "[0-9]{5}" + }, + { + "abbrev": "DJ", + "name": "Djibouti" + }, + { + "abbrev": "DM", + "name": "Dominica" + }, + { + "abbrev": "DO", + "name": "Dominican Republic", + "zip": "[0-9]{5}" + }, + { + "abbrev": "TL", + "name": "East Timor" + }, + { + "abbrev": "EC", + "name": "Ecuador", + "zip": "[0-9]{6}" + }, + { + "abbrev": "EG", + "name": "Egypt", + "zip": "[0-9]{5}" + }, + { + "abbrev": "SV", + "name": "El Salvador", + "zip": "[0-9]{4}" + }, + { + "abbrev": "ER", + "name": "Eritrea" + }, + { + "abbrev": "EE", + "name": "Estonia", + "zip": "[0-9]{5}" + }, + { + "abbrev": "ET", + "name": "Ethiopia", + "zip": "[0-9]{4}" + }, + { + "abbrev": "FK", + "name": "Falkland Islands", + "zip": "FIQQ 1ZZ" + }, + { + "abbrev": "FO", + "name": "Faroe Islands", + "zip": "[0-9]{3}" + }, + { + "abbrev": "FJ", + "name": "Fiji" + }, + { + "abbrev": "FI", + "name": "Finland", + "zip": "[0-9]{5}" + }, + { + "abbrev": "FR", + "name": "France", + "zip": "[0-9]{5}" + }, + { + "abbrev": "PF", + "name": "French Polynesia", + "zip": "987[0-9]{2}", + "range": [ + "98700", + "98790" + ] + }, + { + "abbrev": "GA", + "name": "Gabon" + }, + { + "abbrev": "GM", + "name": "Gambia" + }, + { + "abbrev": "GE", + "name": "Georgia" + }, + { + "abbrev": "DE", + "name": "Germany", + "zip": "[0-9]{5}" + }, + { + "abbrev": "GH", + "name": "Ghana" + }, + { + "abbrev": "GI", + "name": "Gibraltar", + "zip": "GX11 1AA" + }, + { + "abbrev": "GR", + "name": "Greece", + "zip": "[0-9]{3} [0-9]{2}" + }, + { + "abbrev": "GL", + "name": "Greenland", + "zip": "[0-9]{4}" + }, + { + "abbrev": "GD", + "name": "Grenada" + }, + { + "abbrev": "GP", + "name": "Guadeloupe", + "zip": "971[0-9]{2}", + "range": [ + "97100", + "97190" + ] + }, + { + "abbrev": "GU", + "name": "Guam", + "zip": "\\d{5}(?:[-\\s]\\d{4})?", + "range": [ + "96910", + "96932" + ] + }, + { + "abbrev": "GT", + "name": "Guatemala", + "zip": "[0-9]{5}" + }, + { + "abbrev": "GG", + "name": "Guernsey", + "zip": "([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))\\s?[0-9][A-Za-z]{2})" + }, + { + "abbrev": "GW", + "name": "Guinea-Bissau", + "zip": "[0-9]{4}" + }, + { + "abbrev": "GQ", + "name": "Guinea-Equatorial" + }, + { + "abbrev": "GN", + "name": "Guinea Republic", + "zip": "[0-9]{3}" + }, + { + "abbrev": "GY", + "name": "Guyana (British)" + }, + { + "abbrev": "GF", + "name": "Guyana (French)", + "zip": "973[0-9]{2}", + "range": [ + "97300", + "97390" + ] + }, + { + "abbrev": "HT", + "name": "Haiti", + "zip": "[0-9]{4}" + }, + { + "abbrev": "HN", + "name": "Honduras", + "zip": "[0-9]{5}" + }, + { + "abbrev": "HK", + "name": "Hong Kong" + }, + { + "abbrev": "HU", + "name": "Hungary", + "zip": "[0-9]{4}" + }, + { + "abbrev": "IS", + "name": "Iceland", + "zip": "[0-9]{3}" + }, + { + "abbrev": "IN", + "name": "India", + "zip": "^(?!0{1})\d{6}$" + }, + { + "abbrev": "ID", + "name": "Indonesia", + "zip": "[0-9]{5}" + }, + { + "abbrev": "IR", + "name": "Iran", + "zip": "[0-9]{5}" + }, + { + "abbrev": "IQ", + "name": "Iraq", + "zip": "[0-9]{5}" + }, + { + "abbrev": "IE", + "name": "Ireland, Republic of", + "zip": "(?:^[AC-FHKNPRTV-Y][0-9]{2}|D6W)[ -]?[0-9AC-FHKNPRTV-Y]{4}$" + }, + { + "abbrev": "FK", + "name": "Islas Malvinas", + "zip": "FIQQ 1ZZ" + }, + { + "abbrev": "IL", + "name": "Israel", + "zip": "[0-9]{5}|[0-9]{7}" + }, + { + "abbrev": "IT", + "name": "Italy", + "zip": "[0-9]{5}" + }, + { + "abbrev": "CI", + "name": "Ivory Coast" + }, + { + "abbrev": "JM", + "name": "Jamaica" + }, + { + "abbrev": "JP", + "name": "Japan", + "zip": "[0-9]{3}-[0-9]{4}" + }, + { + "abbrev": "JE", + "name": "Jersey", + "zip": "([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))\\s?[0-9][A-Za-z]{2})" + }, + { + "abbrev": "JO", + "name": "Jordan", + "zip": "[0-9]{5}" + }, + { + "abbrev": "KZ", + "name": "Kazakhstan", + "zip": "[0-9]{6}" + }, + { + "abbrev": "KE", + "name": "Kenya", + "zip": "[0-9]{5}" + }, + { + "abbrev": "KI", + "name": "Kiribati" + }, + { + "abbrev": "KR", + "name": "Korea, Republic of", + "zip": "[0-9]{5}" + }, + { + "abbrev": "KP", + "name": "Korea, The D.P.R of" + }, + { + "abbrev": "XK", + "name": "Kosovo", + "zip": "[0-9]{5}" + }, + { + "abbrev": "KW", + "name": "Kuwait", + "zip": "[0-9]{5}" + }, + { + "abbrev": "KG", + "name": "Kyrgyzstan", + "zip": "[0-9]{6}" + }, + { + "abbrev": "LA", + "name": "Laos", + "zip": "[0-9]{5}" + }, + { + "abbrev": "LV", + "name": "Latvia", + "zip": "LV-[0-9]{4}" + }, + { + "abbrev": "LB", + "name": "Lebanon", + "zip": "[0-9]{4} [0-9]{4}" + }, + { + "abbrev": "LS", + "name": "Lesotho", + "zip": "[0-9]{3}" + }, + { + "abbrev": "LR", + "name": "Liberia", + "zip": "[0-9]{4}" + }, + { + "abbrev": "LY", + "name": "Libya" + }, + { + "abbrev": "LI", + "name": "Liechtenstein", + "zip": "[0-9]{4}", + "range": [ + "9485", + "9498" + ] + }, + { + "abbrev": "LT", + "name": "Lithuania", + "zip": "LT-[0-9]{5}" + }, + { + "abbrev": "LU", + "name": "Luxembourg", + "zip": "[0-9]{4}" + }, + { + "abbrev": "MO", + "name": "Macau" + }, + { + "abbrev": "MK", + "name": "Macedonia, Republic of", + "zip": "[0-9]{4}" + }, + { + "abbrev": "MG", + "name": "Madagascar", + "zip": "[0-9]{3}" + }, + { + "abbrev": "MW", + "name": "Malawi" + }, + { + "abbrev": "MY", + "name": "Malaysia", + "zip": "[0-9]{5}" + }, + { + "abbrev": "MV", + "name": "Maldives", + "zip": "[0-9]{5}" + }, + { + "abbrev": "ML", + "name": "Mali" + }, + { + "abbrev": "MT", + "name": "Malta", + "zip": "[A-Z]{3} [0-9]{4}" + }, + { + "abbrev": "MH", + "name": "Marshall Islands", + "zip": "\\d{5}(?:[-\\s]\\d{4})?", + "range": [ + "96960", + "96970" + ] + }, + { + "abbrev": "MQ", + "name": "Martinique", + "zip": "972[0-9]{2}", + "range": [ + "97200", + "97290" + ] + }, + { + "abbrev": "MR", + "name": "Mauritania" + }, + { + "abbrev": "MU", + "name": "Mauritius", + "zip": "[0-9]{5}" + }, + { + "abbrev": "YT", + "name": "Mayotte", + "zip": "976[0-9]{2}", + "range": [ + "97600", + "97690" + ] + }, + { + "abbrev": "MX", + "name": "Mexico", + "zip": "[0-9]{5}" + }, + { + "abbrev": "MD", + "name": "Moldova, Republic of", + "zip": "MD-?[0-9]{4}" + }, + { + "abbrev": "MC", + "name": "Monaco", + "zip": "980[0-9]{2}" + }, + { + "abbrev": "MN", + "name": "Mongolia", + "zip": "[0-9]{5}" + }, + { + "abbrev": "ME", + "name": "Montenegro", + "zip": "[0-9]{5}" + }, + { + "abbrev": "MS", + "name": "Montserrat", + "zip": "MSR [0-9]{4}", + "range": [ + "MSR 1110", + "MSR 1350" + ] + }, + { + "abbrev": "MA", + "name": "Morocco", + "zip": "[0-9]{5}" + }, + { + "abbrev": "MZ", + "name": "Mozambique", + "zip": "[0-9]{4}" + }, + { + "abbrev": "MM", + "name": "Myanmar", + "zip": "[0-9]{5}" + }, + { + "abbrev": "NA", + "name": "Namibia" + }, + { + "abbrev": "NR", + "name": "Nauru" + }, + { + "abbrev": "NP", + "name": "Nepal", + "zip": "[0-9]{5}" + }, + { + "abbrev": "NL", + "name": "Netherlands", + "zip": "(?:NL-)?(\\d{4})\\s*([A-Z]{2})" + }, + { + "abbrev": "NC", + "name": "New Caledonia", + "zip": "988[0-9]{2}", + "range": [ + "96950", + "96952" + ] + }, + { + "abbrev": "NZ", + "name": "New Zealand", + "zip": "[0-9]{4}" + }, + { + "abbrev": "NI", + "name": "Nicaragua" + }, + { + "abbrev": "NE", + "name": "Niger", + "zip": "[0-9]{4}" + }, + { + "abbrev": "NG", + "name": "Nigeria", + "zip": "[0-9]{6}" + }, + { + "abbrev": "NU", + "name": "Niue" + }, + { + "abbrev": "MP", + "name": "Northern Mariana Islands", + "zip": "^\\d{5}(?:[-\\s]\\d{4})?$" + }, + { + "abbrev": "NO", + "name": "Norway", + "zip": "[0-9]{4}" + }, + { + "abbrev": "OM", + "name": "Oman", + "zip": "[0-9]{3}" + }, + { + "abbrev": "PK", + "name": "Pakistan", + "zip": "[0-9]{5}" + }, + { + "abbrev": "PW", + "name": "Palau", + "zip": "\\d{5}(?:[-\\s]\\d{4})?" + }, + { + "abbrev": "PA", + "name": "Panama", + "zip": "[0-9]{4}" + }, + { + "abbrev": "PG", + "name": "Papua New Guinea", + "zip": "[0-9]{3}" + }, + { + "abbrev": "PY", + "name": "Paraguay", + "zip": "[0-9]{4}" + }, + { + "abbrev": "PE", + "name": "Peru", + "zip": "[0-9]{5}" + }, + { + "abbrev": "PH", + "name": "Philippines", + "zip": "[0-9]{4}" + }, + { + "abbrev": "PL", + "name": "Poland", + "zip": "[0-9]{2}-[0-9]{3}" + }, + { + "abbrev": "PT", + "name": "Portugal", + "zip": "[0-9]{4}-[0-9]{3}" + }, + { + "abbrev": "PR", + "name": "Puerto Rico", + "zip": "\\d{5}(?:[-\\s]\\d{4})?" + }, + { + "abbrev": "QA", + "name": "Qatar" + }, + { + "abbrev": "RE", + "name": "Réunion", + "zip": "974[0-9]{2}", + "range": [ + "97400", + "97490" + ] + }, + { + "abbrev": "RO", + "name": "Romania", + "zip": "[0-9]{6}" + }, + { + "abbrev": "RU", + "name": "Russian Federation", + "zip": "[0-9]{6}" + }, + { + "abbrev": "RW", + "name": "Rwanda" + }, + { + "abbrev": "MP", + "name": "Saipan", + "zip": "96950" + }, + { + "abbrev": "WS", + "name": "Samoa", + "zip": "WS[0-9]{4}" + }, + { + "abbrev": "ST", + "name": "Sao Tome and Principe" + }, + { + "abbrev": "SA", + "name": "Saudi Arabia", + "zip": "[0-9]{5}(-[0-9]{4})?" + }, + { + "abbrev": "SN", + "name": "Senegal", + "zip": "[0-9]{5}" + }, + { + "abbrev": "RS", + "name": "Serbia", + "zip": "[0-9]{5}" + }, + { + "abbrev": "SC", + "name": "Seychelles" + }, + { + "abbrev": "SL", + "name": "Sierra Leone" + }, + { + "abbrev": "SG", + "name": "Singapore", + "zip": "[0-9]{6}" + }, + { + "abbrev": "SK", + "name": "Slovakia", + "zip": "[0-9]{3} [0-9]{2}" + }, + { + "abbrev": "SI", + "name": "Slovenia", + "zip": "[0-9]{4}" + }, + { + "abbrev": "SB", + "name": "Solomon Islands" + }, + { + "abbrev": "SO", + "name": "Somalia", + "zip": "[A-Z]{2} [0-9]{5}" + }, + { + "abbrev": "ZA", + "name": "South Africa", + "zip": "[0-9]{4}" + }, + { + "abbrev": "SS", + "name": "South Sudan" + }, + { + "abbrev": "ES", + "name": "Spain", + "zip": "[0-9]{5}" + }, + { + "abbrev": "LK", + "name": "Sri Lanka", + "zip": "[0-9]{4}" + }, + { + "abbrev": "BL", + "name": "St. Barthélemy", + "zip": "[0-9]{5}", + "range": [ + "97100", + "97190" + ] + }, + { + "abbrev": "VI", + "name": "St. Croix", + "zip": "[0-9]{5}" + }, + { + "abbrev": "SE", + "name": "St. Eustatius" + }, + { + "abbrev": "SH", + "name": "St. Helena", + "zip": "STHL 1ZZ" + }, + { + "abbrev": "AG", + "name": "St. John", + "zip": "\\d{5}(?:[-\\s]\\d{4})?" + }, + { + "abbrev": "KN", + "name": "St. Kitts and Nevis", + "zip": "[A-Z]{2}[0-9]{4}" + }, + { + "abbrev": "LC", + "name": "St. Lucia", + "zip": "[A-Z]{2}[0-9]{2} [0-9]{3}" + }, + { + "abbrev": "SX", + "name": "St. Maarten" + }, + { + "abbrev": "VI", + "name": "St. Thomas" + }, + { + "abbrev": "VC", + "name": "St. Vincent and the Grenadines", + "zip": "VC[0-9]{4}" + }, + { + "abbrev": "SD", + "name": "Sudan", + "zip": "[0-9]{5}" + }, + { + "abbrev": "SR", + "name": "Suriname" + }, + { + "abbrev": "SZ", + "name": "Swaziland", + "zip": "[A-Z]{1}[0-9]{3}" + }, + { + "abbrev": "SE", + "name": "Sweden", + "zip": "[0-9]{3} [0-9]{2}" + }, + { + "abbrev": "CH", + "name": "Switzerland", + "zip": "[0-9]{4}" + }, + { + "abbrev": "SY", + "name": "Syria" + }, + { + "abbrev": "PF", + "name": "Tahiti", + "zip": "[0-9]{5}" + }, + { + "abbrev": "TW", + "name": "Taiwan", + "zip": "[0-9]{3}(-[0-9]{2})?" + }, + { + "abbrev": "TZ", + "name": "Tanzania", + "zip": "[0-9]{5}" + }, + { + "abbrev": "TH", + "name": "Thailand", + "zip": "[0-9]{5}" + }, + { + "abbrev": "TG", + "name": "Togo" + }, + { + "abbrev": "TO", + "name": "Tonga" + }, + { + "abbrev": "VG", + "name": "Tortola", + "zip": "VG[0-9]{4}" + }, + { + "abbrev": "TT", + "name": "Trinidad and Tobago", + "zip": "[0-9]{6}" + }, + { + "abbrev": "TN", + "name": "Tunisia", + "zip": "[0-9]{4}" + }, + { + "abbrev": "TR", + "name": "Turkey", + "zip": "[0-9]{5}" + }, + { + "abbrev": "TM", + "name": "Turkmenistan", + "zip": "[0-9]{6}" + }, + { + "abbrev": "TC", + "name": "Turks and Caicos Islands", + "zip": "TKCA 1ZZ" + }, + { + "abbrev": "TV", + "name": "Tuvalu" + }, + { + "abbrev": "UG", + "name": "Uganda" + }, + { + "abbrev": "UA", + "name": "Ukraine", + "zip": "[0-9]{5}" + }, + { + "abbrev": "AE", + "name": "United Arab Emirates" + }, + { + "abbrev": "GB", + "name": "United Kingdom", + "zip": "([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))\\s?[0-9][A-Za-z]{2})" + }, + { + "abbrev": "US", + "name": "United States of America", + "zip": "^[0-9]{5}(?:-[0-9]{4})?$" + }, + { + "abbrev": "UY", + "name": "Uruguay", + "zip": "[0-9]{5}" + }, + { + "abbrev": "UZ", + "name": "Uzbekistan", + "zip": "[0-9]{6}" + }, + { + "abbrev": "VU", + "name": "Vanuatu" + }, + { + "abbrev": "VE", + "name": "Venezuela", + "zip": "[0-9]{4}(-[A-Z]{1})?" + }, + { + "abbrev": "VN", + "name": "Vietnam", + "zip": "[0-9]{6}" + }, + { + "abbrev": "VG", + "name": "Virgin Islands (British)", + "zip": "VG[0-9]{4}" + }, + { + "abbrev": "VI", + "name": "Virgin Islands (US)", + "range": [ + "00801", + "00851" + ], + "zip": "\\d{5}(?:[-\\s]\\d{4})?" + }, + { + "abbrev": "YE", + "name": "Yemen" + }, + { + "abbrev": "ZM", + "name": "Zambia", + "zip": "[0-9]{5}" + }, + { + "abbrev": "ZW", + "name": "Zimbabwe" + } +] diff --git a/src/edify/library/zip.py b/src/edify/library/zip.py new file mode 100644 index 0000000..88152ee --- /dev/null +++ b/src/edify/library/zip.py @@ -0,0 +1,28 @@ +import re +from .support.zip import ZIP_LOCALES +locales = [locale["abbrev"] for locale in ZIP_LOCALES] + +def zip(zip: str, locale: str = "US") -> bool: + """Check if a string is a valid zip code. + + Args: + zip (str): The string to check. + locale (str): (optional) The locale to check against. Defaults to "US". + Returns: + bool: True if the string is a valid zip code, False otherwise. + """ + + if not isinstance(locale, str): + raise TypeError("locale must be a string") + + if locale == "": + raise ValueError("locale cannot be empty") + + if locale not in locales: + print(locales) + raise ValueError("locale must be one of {}".format(locales)) + + pattern = ZIP_LOCALES[locales.index(locale)]["zip"] + return re.match(pattern, zip) is not None + + |
