Python在字符串列表中查找最常见的模式

Python在字符串列表中查找最常见的模式,python,regex,string,pattern-matching,Python,Regex,String,Pattern Matching,我有一个以字符串形式存储的API调用的大列表,这些调用已从所有常用语法中删除('htttp://'、'.com'、'等…) 我想返回长度大于3的最常见模式的字典,其中键是找到的模式,值是每个模式的出现次数。我试过这个: calls = ['admobapioauthcert', 'admobapinewsession', 'admobendusercampaign'] >>> from itertools import takewhile, izip >>>

我有一个以字符串形式存储的API调用的大列表,这些调用已从所有常用语法中删除('htttp://'、'.com'、'等…)

我想返回长度大于3的最常见模式的字典,其中键是找到的模式,值是每个模式的出现次数。我试过这个:

calls = ['admobapioauthcert', 'admobapinewsession', 'admobendusercampaign']

>>> from itertools import takewhile, izip
>>> ''.join(c[0] for c in takewhile(lambda x: all(x[0] == y for y in x), izip(*calls)))
返回:

'admob'
我希望它能返回:

{'obap': 2, 'dmob': 3, 'admo': 3, 'admobap': 2, 'bap': 2, 'dmobap': 2, 'admobapi': 2, 'moba': 2, 'bapi': 2, 'dmo': 3, 'obapi': 2, 'mobapi': 2, 'admob': 3, 'api': 2, 'dmobapi': 2, 'dmoba': 2, 'mobap': 2, 'mob': 3, 'adm': 3, 'admoba': 2, 'oba': 2}

-我当前的方法只用于识别前缀,但我需要它对所有字符进行操作,而不管它在字符串中的位置如何,而且我想再次将每个模式的出现次数存储为dict值。(我尝试过其他方法来实现这一点,但它们非常难看)

使用
集合。计数器
,然后按点拆分,最后使用dict-

>>>from collections import Counter
>>>calls = ['admob.api.oauthcert', 'admob.api.newsession', 'admob.endusercampaign']
>>>l = '.'.join(calls).split(".")
>>>d = Counter(l)
>>>{k:v for k,v in d.most_common(3) }
>>>{'admob': 3, 'api': 2}
>>>{k:v for k,v in d.most_common(4) }
>>>{'admob': 3, 'api': 2, 'newsession': 1, 'oauthcert': 1}


使用
集合。计数器
,然后按点拆分,最后使用dict-

>>>from collections import Counter
>>>calls = ['admob.api.oauthcert', 'admob.api.newsession', 'admob.endusercampaign']
>>>l = '.'.join(calls).split(".")
>>>d = Counter(l)
>>>{k:v for k,v in d.most_common(3) }
>>>{'admob': 3, 'api': 2}
>>>{k:v for k,v in d.most_common(4) }
>>>{'admob': 3, 'api': 2, 'newsession': 1, 'oauthcert': 1}


这就是你想要的吗。它给出了在点上拆分后字符串的常见模式

calls = ['admob.api.oauthcert', 'admob.api.newsession', 'admob.endusercampaign']
from collections import Counter
Counter(reduce(lambda x,y: x+y,map (lambda x : x.split("."),calls))).most_common(2)
O/p:
[('admob',3),('api',2)]

更新: 我不知道这是否适用于您:

calls = ['admobapioauthcert', 'admobapinewsession', 'admobendusercamp']
filter(lambda x : x[1]>1 and len(x[0])>2,Counter(reduce(lambda x,y:x + y,reduce(lambda x,y: x+y, map(lambda z :map(lambda x : map(lambda g: z[g:x+1],range(len(z[:x+1]))),range(len(z))),calls)))).most_common())
O/p:


这就是你想要的吗。它给出了在点上拆分后字符串的常见模式

calls = ['admob.api.oauthcert', 'admob.api.newsession', 'admob.endusercampaign']
from collections import Counter
Counter(reduce(lambda x,y: x+y,map (lambda x : x.split("."),calls))).most_common(2)
O/p:
[('admob',3),('api',2)]

更新: 我不知道这是否适用于您:

calls = ['admobapioauthcert', 'admobapinewsession', 'admobendusercamp']
filter(lambda x : x[1]>1 and len(x[0])>2,Counter(reduce(lambda x,y:x + y,reduce(lambda x,y: x+y, map(lambda z :map(lambda x : map(lambda g: z[g:x+1],range(len(z[:x+1]))),range(len(z))),calls)))).most_common())
O/p:


我只需要在一个点上拆分,保存到字典中,并过滤多个事件。你不能真正地存储每个url的每个可能的子字符串,这将占用大量的内存和时间。点并不总是存在于字符串中。我不太关心内存/存储。。我们的aws设置非常糟糕。不可能像你说的那样获得{admob:3,mob:3,api:2}。这个问题应该再次编辑,并改为{'obap':2,'dmob':3,'admo':3,'admobap':2,'bap':2,'admobap':2,'moba':2,'bapi':2,'dmo':3,'api':2,'dmobapi':2,'mobap':2,'moba':3,'adm':3,'admoba':2,'admoba':2}我只需要在一个点上分开,保存到字典里,并筛选多个事件。你不能真正地存储每个url的每个可能的子字符串,这将占用大量的内存和时间。点并不总是存在于字符串中。我不太关心内存/存储。。我们的aws设置非常糟糕。不可能像你说的那样获得{admob:3,mob:3,api:2}。该问题应再次编辑并更改为{'obap':2,'dmob':3,'admo':3,'admobap':2,'bap':2,'admobap':2,'moba':2,'bapi':2,'dmo':3,'api':2,'dmobap':2,'dmoba':2,'mobap':3,'adm':3,'admoba':2,'admoba':2}不完全如上文所述,点号并不总是出现在通话中。感谢您的努力。这将提供所有模式>len(3)。只是在一个巨大的数据集上可能需要时间,还有一件事是您需要admob作为答案。但这会给你adm,admo,admob,dmo,dmob,mob。所以你需要做更多的过滤。但这肯定会起作用。这是完美的——你对过滤的看法是对的。将最小字符串长度增加到4应该是一个好的开始。写得很好的Sir不完全一样——如上所述,点号并不总是出现在通话中。感谢您的努力。这将提供所有模式>len(3)。只是在一个巨大的数据集上可能需要时间,还有一件事是您需要admob作为答案。但这会给你adm,admo,admob,dmo,dmob,mob。所以你需要做更多的过滤。但这肯定会起作用。这是完美的——你对过滤的看法是对的。将最小字符串长度增加到4应该是一个好的开始。正如我在上面的评论中提到的,这些点并不总是出现在字符串中。我对问题进行了编辑,以便更清楚地了解这一点。我感谢你的帮助。正如我在上面的评论中提到的,点并不总是出现在字符串中。我对问题进行了编辑,以便更清楚地了解这一点。我感谢你的帮助。
[('admo', 3), ('admob', 3), ('adm', 3), ('mob', 3), ('dmob', 3), ('dmo', 3), ('bapi', 2), ('dmobapi', 2), ('dmoba', 2), ('api', 2), ('obapi', 2), ('admobap', 2), ('admoba', 2), ('mobap', 2), ('dmobap', 2), ('bap', 2), ('mobapi', 2), ('moba', 2), ('obap', 2), ('oba', 2), ('admobapi', \
2)]