Python - создать подстановочные строки, чтобы соответствовать всем строкам в массиве - PullRequest
0 голосов
/ 14 января 2019

Я пытался классифицировать URL-адреса, к которым обращались по моей локальной сети. Мне удалось добраться до точки, где у меня есть длинный список URL-адресов, и я сопоставил их с веб-сайтом / сервисом, который их использует. Мне нужно ввести эти URL в систему классификации, которая имеет поля:

  • URL - URL-адрес сервиса. В этом поле можно использовать подстановочные знаки в стиле Unix, например, * () Яблоко () ком
  • Родитель - Материнская компания службы, например Яблоко
  • Бренд - название самой услуги, например ITunes

Я классифицировал около 62 000 URL-адресов. Я мог бы просто импортировать их непосредственно в систему, однако с этим есть несколько проблем.

Во-первых, я бы предпочел, чтобы система была читабельной и простой в обслуживании (именно поэтому была добавлена ​​поддержка подстановочных знаков). Во-вторых, , и это моя главная проблема , я хотел бы связать CDN, которые доставляют видео / аудио / игровой контент, в правильные бренды.

Если мы рассмотрим потоковый сервис FakeStreaming () com. Я бы добавил * () fakestreaming () com в систему, но это не позволило бы подобрать CDN, которые фактически доставляют контент, только общедоступный веб-сайт. Я наблюдал, как FakeStreaming () com использовал следующие URL-адреса CDN:

  • a432hlsvideo () genericcdn () ком
  • a121hlsvideo () genericcdn () ком
  • a121dashvideo () genericcdn () ком
  • a232dashvideo () genericcdn () ком

Из этого мы можем сделать вывод, что CDN использует соглашение об именах:

<"a" | "d"> <3-4 числа> <"hls" | "dash"> video () genericcdn () com ()

Из этого я делаю две подстановочные записи -

  • а ??? hlsvideo () genericcdn () ком
  • а ??? dashvideo () genericcdn () ком

    Многие сервисы используют один и тот же CDN, поэтому я должен быть максимально точным. Я должен использовать шаблоны для этого, как будто я определяю «a432hlsvideo () genericcdn () com» как строку, и на следующей неделе кто-то получает потоковую передачу от «a132hlsvideo () genericcdn () com», система не поймет, что они из того же сервис.

Я пытался сгруппировать похожие домены с помощью функции Python difflib.get_close_matches () . Выходные данные для службы потоковой передачи NBA приведены ниже.

['nbanlds317live()akamaized()net', 'nbanlds263live()akamaized()net', 'nbanlds245vod()akamaized()net', 'nbanlds225live()akamaized()net', 'nbanlds289live()akamaized()net', 'nbanlds316live()akamaized()net', 'nbanlds294live()akamaized()net', 'nbanlds264live()akamaized()net', 'nbanlds233live()akamaized()net', 'nbanlds301live()akamaized()net', 'nbanlds235live()akamaized()net', 'nbanlds307live()akamaized()net', 'nbanlds293live()akamaized()net', 'nbanlds216live()akamaized()net', 'nbanlds222live()akamaized()net', 'nbanlds285live()akamaized()net', 'nbanlds291live()akamaized()net', 'nbanlds295live()akamaized()net', 'nbanlds284live()akamaized()net', 'nbanlds314live()akamaized()net', 'nbanlds290live()akamaized()net', 'nbanlds311live()akamaized()net', 'nbanlds304live()akamaized()net', 'nbanlds209live()akamaized()net', 'nbanlds262live()akamaized()net', 'nbanlds315live()akamaized()net', 'nbanlds158live()akamaized()net', 'nbanlds310live()akamaized()net', 'nbanlds119vod()akamaized()net', 'nbanlds211live()akamaized()net', 'nbanlds213live()akamaized()net', 'nbanlds302live()akamaized()net', 'nbanlds318live()akamaized()net', 'nbanlds288live()akamaized()net', 'nbanlds287live()akamaized()net', 'nbanlds210live()akamaized()net', 'nbanlds237live()akamaized()net', 'nbanlds313live()akamaized()net', 'nbanlds234live()akamaized()net', 'nbanlds286live()akamaized()net', 'nbanlds312live()akamaized()net']
['a1715()dscw10()akamai()net', 'a245()dscw10()akamai()net', 'a1323()dscw10()akamai()net', 'a1951()dscw10()akamai()net', 'a28()dscw10()akamai()net', 'a1170()dscw10()akamai()net', 'a762()dscw10()akamai()net', 'a988()dscw10()akamai()net']

Как вы можете видеть, он разделяет URL-адреса, используемые CDN NBA, на логические группы.

Мой вопрос: Как бы я написал некоторый код для автоматического генерирования подстановочных строк, соответствующих этим логическим группам. то есть 1 или более подстановочных знаков для каждой группы. Необходимо создать как можно больше подстановочных строк, чтобы все URL-адреса в массиве были сопоставлены. Например, вывод для групп NBA будет:

  • nbanlds * жить () akamaized () нетто
  • nbanlds * VOD () akamaized () нетто

и

  • а * () dscw10 () Akamai () нетто

Я пытался найти какие-либо примеры того, как кто-то пытался сделать подобное, но я оказался пустым. Моя первоначальная идея состояла в том, чтобы разделить URL-адрес по десятичному знаку и сравнить похожие сегменты, однако я столкнулся с некоторыми проблемами с этим, где (как выше) есть такие вещи, как переменные числа в URL. Я пытался включить RegEx, но я недостаточно хорошо их понимаю, чтобы сделать что-то подобное.

Я прошу прощения за длинный пост - я просто хотел убедиться, что у меня достаточно деталей. Спасибо, любезно! :)

...