"""Regexes used in the DNS protocol""" def grpm(regex): """Make a matching group""" return grp(regex, matching=True) def grp(regex, matching=False): """Make a group""" return r'(' + (r'' if matching else r'?:') + regex + r')' def opt(regex): """Make an optional group""" return grp(grp(regex) + r'?') def regex_opt_r(*regexes): """Make a group that matches one of the given regexes""" return grp(r'|'.join(regexes)) DIGIT = r'\d' LETTER = r'[a-zA-Z]' LETDIG = grp(regex_opt_r(DIGIT, LETTER)) LETDIGHYP = grp(regex_opt_r(LETDIG, r'-')) LDHSTR = grp(LETDIGHYP + r'+') LABEL = grp(LETTER + opt(opt(LDHSTR) + LETDIG)) SUBDOMAIN = grp(grpm(grp(LABEL + r'\.') + r'*') + grpm(LABEL)) DOMAIN = regex_opt_r(SUBDOMAIN, r' ') IP = r'(?:(?:\d{1,3}\.){3}\d{1,3})'