def parse(s,L=None):
do_return=L is None
if(not s):
return
if(do_return):
L=[]
substr=s[0]
for i in range(1,len(s)-1):
if s[:i] in s[i:]:
substr=s[:i]
else:
L.append(substr)
parse(s.replace(substr,''),L=L)
break
else:
L.append(s)
if(do_return):
LL=[(ss,s.count(ss)) for ss in L] #Count the number of times each substring appears
LLL=[]
#Now some of our (unmatched) substrings will be adjacent to each other.
#We should merge all adjacent unmatched strings together.
while LL:
LLL.append(LL.pop(0))
while LLL[-1][1] == 1 and LL: #check if next is unmatched
if(LL[0][1]==1): #unmatched, merge and remove
LLL[-1]=(LLL[-1][0]+LL[0][0],1)
LL.pop(0)
else: #matched, keep on going.
break
d={}
for k,v in LLL:
d[k]=v
return d
S='eg,abcgdfabc'
print parse(S) #{ 'e':1, 'g':2, ',':1, 'abc': 2, 'df', 1}
此正则表达式查找字母数字组,后跟任意数量的其他字符,然后再单独查找。然后,它在删除重复项的情况下遍历此列表,并给出这些字符组及其出现的次数:
印刷品
^{pr2}$但是,如果我们不知道单词的确切含义,那么它只会在下面的字符串中找到一个重复的单词,尽管还有另一个候选词:
这里有一个丑陋的解决方案:
当然,这并不像您所期望的那样工作,因为g匹配两次(因为它是贪婪的)。。。在
如果您总是想以3人一组的方式进行迭代,这会变得更简单(更漂亮):
^{pr2}$如果您使用Python2.7+
相关问题 更多 >
编程相关推荐