import re from typing import Final, List # NOTE(robinson) - Modified from answers found on this stackoverflow post # ref: https://stackoverflow.com/questions/16699007/ # regular-expression-to-match-standard-10-digit-phone-number US_PHONE_NUMBERS_PATTERN = ( r"(?:\+?(\d{1,3}))?[-. (]*(\d{3})?[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$" ) US_PHONE_NUMBERS_RE = re.compile(US_PHONE_NUMBERS_PATTERN) # NOTE(robinson) - Based on this regex from regex101. Regex was updated to run fast # and avoid catastrophic backtracking # ref: https://regex101.com/library/oR3jU1?page=673 US_CITY_STATE_ZIP_PATTERN = ( r"(?i)\b(?:[A-Z][a-z.-]{1,15}[ ]?){1,5},\s?" r"(?:{Alabama|Alaska|Arizona|Arkansas|California|Colorado|Connecticut|Delaware|Florida" r"|Georgia|Hawaii|Idaho|Illinois|Indiana|Iowa|Kansas|Kentucky|Louisiana|Maine|Maryland" r"|Massachusetts|Michigan|Minnesota|Mississippi|Missouri|Montana|Nebraska|Nevada|" r"New[ ]Hampshire|New[ ]Jersey|New[ ]Mexico|New[ ]York|North[ ]Carolina|North[ ]Dakota" r"|Ohio|Oklahoma|Oregon|Pennsylvania|Rhode[ ]Island|South[ ]Carolina|South[ ]Dakota" r"|Tennessee|Texas|Utah|Vermont|Virginia|Washington|West[ ]Virginia|Wisconsin|Wyoming}" r"|{AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN" r"|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|" r"WA|WV|WI|WY})(, |\s)?(?:\b\d{5}(?:-\d{4})?\b)" ) US_CITY_STATE_ZIP_RE = re.compile(US_CITY_STATE_ZIP_PATTERN) UNICODE_BULLETS: Final[List[str]] = [ "\u0095", "\u2022", "\u2023", "\u2043", "\u3164", "\u204c", "\u204d", "\u2219", "\u25cb", "\u25cf", "\u25d8", "\u25e6", "\u2619", "\u2765", "\u2767", "\u29be", "\u29bf", "\u002d", "\u2013", "", r"\*", "\x95", "·", ] BULLETS_PATTERN = "|".join(UNICODE_BULLETS) UNICODE_BULLETS_RE = re.compile(f"(?:{BULLETS_PATTERN})(?!{BULLETS_PATTERN})") # zero-width positive lookahead so bullet characters will not be removed when using .split() UNICODE_BULLETS_RE_0W = re.compile(f"(?={BULLETS_PATTERN})(?