Мне нравится тщательность ответа Тима Пицкера, но я предпочитаю выгружать часть логики из регулярных выражений для удобства чтения. Честно говоря, мне пришлось искать значение этих (?
«расширенных обозначений». Кроме того, я считаю, что «двойной отрицательный» подход более очевиден в том смысле, что он ограничивает ответственность регулярного выражения только нахождением любого недопустимого символа. Мне нравится, что re.IGNORECASE позволяет сократить регулярное выражение.
Так вот еще один выстрел; это длиннее, но это звучит как проза. Я полагаю, что «читабельный» несколько расходится с «кратким». Я полагаю, что все ограничения валидации, упомянутые в этой теме, уже рассмотрены:
def isValidHostname(hostname):
if len(hostname) > 255:
return False
if hostname.endswith("."): # A single trailing dot is legal
hostname = hostname[:-1] # strip exactly one dot from the right, if present
disallowed = re.compile("[^A-Z\d-]", re.IGNORECASE)
return all( # Split by labels and verify individually
(label and len(label) <= 63 # length is within proper range
and not label.startswith("-") and not label.endswith("-") # no bordering hyphens
and not disallowed.search(label)) # contains only legal characters
for label in hostname.split("."))