Регулярное выражение для соответствия Domain.CCTLD

Кто-нибудь знает регулярное выражение для соответствия Domain.CCTLD? Мне не нужны субдомены, только «атомарный домен». Например, docs.google.com не соответствует, но google.com соответствует. Однако это усложняется с такими вещами, как .co.uk, CCTLD. Кто-нибудь знает решение? Заранее спасибо.

РЕДАКТИРОВАТЬ: Я понял, что мне также приходится иметь дело с несколькими поддоменами, например john.doe.google.co.uk. Решение нужно сейчас как никогда: P.


person Tom    schedule 07.07.2010    source источник
comment
Вам явно нужно регулярное выражение или достаточно функции?   -  person Benson    schedule 08.07.2010
comment
Это стало бы довольно большим регулярным выражением, поскольку вам нужно будет рассматривать все ccSLD как особые случаи, а существует много (и я имею в виду МНОГО) ccSLD. В Бразилии их 66!   -  person You    schedule 08.07.2010
comment
@Benson, функция будет работать, если сможет найти domain.cctld в длинном списке доменов.   -  person Tom    schedule 08.07.2010
comment
возможный дубликат Получить субдомен по URL-адресу   -  person Greg Hewgill    schedule 08.07.2010


Ответы (3)


Основываясь на вашем комментарии выше, я собираюсь переосмыслить вопрос - вместо того, чтобы создавать регулярное выражение, которое будет соответствовать им, мы создадим функцию, которая будет соответствовать им, и применим эту функцию для фильтрации списка доменных имен только для включать домены первого класса, например google.com, amazon.co.uk.

Во-первых, нам понадобится список TLD. Как сказал Грег, список публичных суффиксов - отличное место для начала. Предположим, вы преобразовали список в массив Python с именем suffixes. Если вам это не нравится, прокомментируйте, и я могу добавить код, который это сделает.

suffixes = parse_suffix_list("suffix_list.txt")

Теперь нам понадобится код, который определяет, соответствует ли данное доменное имя шаблону some-name.suffix:

def is_domain(d):
    for suffix in suffixes:
        if d.endswith(suffix):
            # Get the base domain name without suffix
            base_name = d[0:-(suffix.length + 1)]
            # If it contains '.', it's a subdomain. 
            if not base_name.contains('.'):
                return true
    # If we get here, no matches were found
    return false
person Benson    schedule 08.07.2010
comment
Спасибо! Я найду дорогу отсюда. - person Tom; 09.07.2010
comment
Без проблем! Рад, что смог помочь. - person Benson; 09.07.2010
comment
Теперь вы можете использовать простой, но отличный пакет python для выполнения тяжелой работы: pypi.python.org/ pypi / publicsuffix - person Martijn Pieters; 14.10.2011

Похоже, вы ищете информацию, доступную в проекте Public Suffix List.

«Открытый суффикс» - это суффикс, под которым пользователи Интернета могут напрямую регистрировать имена. Некоторые примеры общедоступных суффиксов: «.com», «.co.uk» и «pvt.k12.wy.us». Список публичных суффиксов - это список всех известных публичных суффиксов.

Не существует единого регулярного выражения, которое бы разумно соответствовало списку общедоступных суффиксов. Вам нужно будет реализовать код для использования списка общедоступных суффиксов или найти существующую библиотеку, которая уже делает это.

person Greg Hewgill    schedule 07.07.2010
comment
Интересный и, наверное, очень полезный список. - person You; 08.07.2010
comment
Спасибо, Грег. Это абсолютно правильный ответ. Существуют библиотеки для обработки общедоступных списков суффиксов на нескольких языках по адресу dkim-reputation.org/regdom- библиотеки - person Anirvan; 08.07.2010
comment
@Anirvan, вы знаете эквивалент Python? Опубликованная вами библиотека доступна только на C, PHP и Perl. - person Tom; 08.07.2010
comment
@Tom: Более года спустя вот пакет Python для работы: pypi.python.org/pypi / publicsuffix - person Martijn Pieters; 14.10.2011

Я бы, вероятно, решил эту проблему, получив полный список TLD и используя его для создания регулярного выражения. Например (в Ruby, извините, еще не Pythonista):

tld_alternation = ['\.com','\.co\.uk','\.eu','\.org',...].join('|')
regex = /^[a-z0-9]([a-z0-9\-]*[a-z0-9])?(#{tld_alternation})$/i

Я не думаю, что возможно правильно провести различие между реальным двухчастным TLD и субдоменом, не зная фактического списка TLD (то есть: вы всегда можете создать субдомен, который выглядит как TLD, если вы знаете, как работает регулярное выражение).

person Mike Tunnicliffe    schedule 07.07.2010