Обратите внимание, что хотя вы можете делать что-то с регулярными выражениями, самый надежный способ для проверки правильности доменных имен - это попытка действительно разрешить имя (с сокетом ). .getaddrinfo ):
from socket import getaddrinfo
result = getaddrinfo("www.google.com", None)
print result[0][4]
Обратите внимание, что технически это может оставить вас открытыми для DoS (если кто-то отправляет тысячи недопустимых доменных имен, это может занять некоторое время для разрешения недопустимых имен), но вы можете просто ограничить количество пользователей, которые пытаются это сделать.
Преимущество этого в том, что он будет распознавать «hotmail.con» как недопустимый (скажем, вместо «hotmail.com»), тогда как регулярное выражение скажет, что «hotmail.con» допустим.