Python-创建通配符字符串以匹配数组中的所有字符串

时间:2019-01-14 01:08:42

标签: python wildcard

我一直在尝试对通过本地网络访问的URL进行分类。我设法找到了很长的网址列表,并将它们映射到使用它们的网站/服务。我需要将这些URL输入到具有以下字段的分类系统中:

  • URL -服务的URL。此字段接受Unix样式的通配符,例如*()apple()com
  • 父级-服务的母公司,例如苹果
  • 品牌-服务本身的名称,例如iTunes

我一直是苹果公司,负责对大约62,000个URL进行分类。我可以将它们直接导入系统,但是有一些问题。

首先,我希望系统易于阅读且易于维护(这就是为什么首先添加通配符支持的原因)。其次,这是我的主要问题,我想将同时提供视频/音频/游戏内容的CDN关联到正确的品牌中。

如果我们考虑流服务FakeStreaming()com。我会在系统中添加*()fakestreaming()com,但这不会选择实际上正在交付内容的CDN,而只会选择面向公众的网站。我观察到使用以下CDN URL的FakeStreaming()com:

  • a432hlsvideo()genericcdn()com
  • a121hlsvideo()genericcdn()com
  • a121dashvideo()genericcdn()com
  • a232dashvideo()genericcdn()com

由此我们可以看出CDN使用以下命名约定:

<“ a” |“ d”> <3-4个数字> <“ hls” |“ dash”> video()genericcdn()com()

由此我输入两个通配符-

  • a ??? hlsvideo()genericcdn()com
  • a ??? dashvideo()genericcdn()com

    许多服务都使用相同的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']

如您所见,它将NBA CDN使用的URL分为逻辑分组。

我的问题是:我将如何编写一些代码来自动生成通配符字符串以匹配这些逻辑组。即每个组1个或多个通配符。它需要创建尽可能多的通配符字符串,以便匹配数组中的所有URL。例如,NBA分组的输出为:

  • nbanlds * live()akamaized()net
  • nbanlds * vod()akamaized()net

  • a *()dscw10()akamai()net

我试图找到某人试图做类似事情的任何例子,但我还是空着。我最初的想法是将URL用小数位分割并比较相似的段,但是与此同时,我遇到了一些问题,其中(如上所示)URL中存在诸如可变数字之类的问题。我曾尝试将RegEx整合进来,但我对它们的理解不够,无法做到这样。

很长的帖子我很抱歉-我只是想确保我有足够的细节。非常感谢你! :)

0 个答案:

没有答案