У меня есть программа, написанная на python3, которая должна анализировать несколько доменных имен каждый день и экстраполировать данные.
Анализируемые данные должны служить в качестве входных данных для функции поиска, для агрегирования (статистика и диаграммы) и сэкономить некоторое время для аналитика, который использует программу.
Точно так же, как вы знаете: у меня действительно нет времени изучать машинное обучение (что здесь кажется довольно хорошим решением), поэтому я решил начать с регулярного выражения, которое я уже использую.
Я уже искал документацию regex внутри и вне StackOverflow и работал над отладчиком на regex101, и я до сих пор не нашел способ сделать то, что мне нужно.
Редактировать (24/6/2019): Я упоминаю машинное обучение из-за причины, по которой мне нужен сложный синтаксический анализатор, который максимально автоматизирует вещи. Это было бы полезно для автоматического выбора, такого как черный список, белый список и т. Д.
Парсер должен учитывать несколько вещей:
- максимальное количество 126 поддоменов плюс TLD
- каждый поддомен не должен быть длиннее 64 символов
- каждый поддомен может содержать только буквенно-цифровые символы, а символ
-
- каждый поддомен не должен начинаться или заканчиваться символом
-
- TLD не должен быть длиннее 64 символов
- TLD не должен содержать только цифры
но я пойду немного глубже:
- первая строка может (необязательно) содержать «тип использования», такой как
cpanel.
, mail.
, webdisk.
, autodiscover.
и т. Д. (Или, может быть, www.
)
- TLD может (необязательно) содержать частицу, такую как
.co
, .gov
, .edu
и т. Д. (Например, .co.uk
)
- последняя часть TLD на самом деле не проверяется ни в одном списке ccTLD / gTLD, и я не думаю, что это будет в будущем
Я решил, что полезно решить эту проблему - это группа регулярных выражений для необязательного типа использования, по одному для каждого субдомена и одна для TLD (необязательная частица должна находиться внутри группы TLD)
С учетом этих правил я нашел решение:
^(?P<USAGE>autodiscover|correo|cpanel|ftp|mail|new|server|webdisk|webhost|webmail[\d]?|wiki|www[\d]?\.)?([a-z\d][a-z\d\-]{0,62}[a-z\d])?((\.[a-z\d][a-z\d\-]{0,62}[a-z\d]){0,124}?(?P<TLD>(\.co|\.com|\.edu|\.net|\.org|\.gov)?\.(?!\d+)[a-z\d]{1,64})$
Приведенное выше решение не возвращает ожидаемых результатов
Я привожу здесь пару примеров:
Пара строк для разбора
without.further.ado.lets.travel.the.forest.com
www.without.further.ado.lets.travel.the.forest.gov.it
Группы, которые я ожидаю найти
- FullMatch
without.further.ado.lets.travel.the.forest.com
group2 without
group3 further
group4 ado
group5 lets
group6 travel
group7 the
1099 * группа 8 *forest
groupTLD .com
- FullMatch
www.without.further.ado.lets.travel.the.forest.gov.it
groupUSAGE www.
group2 without
group3 further
group4 ado
group5 lets
group6 travel
group7 the
* 1140 группа-*forest
groupTLD .gov.it
Группы, которые я нахожу
- FullMatch
without.further.ado.lets.travel.the.forest.com
group2 without
group3 .further.ado.lets.travel.the.forest
group4 .forest
groupTLD .com
- FullMatch
www.without.further.ado.lets.travel.the.forest.gov.it
groupUSAGE www.
group2 without
group3 .further.ado.lets.travel.the.forest
group4 .forest
groupTLD .gov.it
группа 6 .gov
Как видно из примеров, пара частиц обнаруживается дважды, и это не то поведение, которое я искал, так или иначе. Любая попытка изменить формулу приводит к непредвиденным результатам.
Есть идеи о том, как найти ожидаемые результаты?