Return 重复子串的长度

Return lengths of repeating substring

对于给定的子字符串,我需要按顺序确定给定字符串中该子字符串的重复链的所有长度。

例子:对于子字符串ATT和一个字符串ATTATTATT GGG ATTATT GGG ATT,我想return (3,2,1).

我想我有一个解决方案,但它不够优雅而且可能很慢(写在下面)。我想在子字符串的起始位置使用 more_itertools.consecutive_groups(),但不知道如何调整长度超过 1 的子字符串。

spans = [i.span() for i in 
         finditer(substring,string)]
lengths = []
runninglength = 1
for i in range(len(spans)):
    if i == len(spans)-1:
        lengths.append(runninglength)
    
    elif spans[i][1] == spans[i+1][0]:
        runninglength += 1
    
    else:
        lengths.append(runninglength)
        runninglength = 1
    return tuple(lengths)

是否有更快、更简单的方法来完成此操作?

您可以使用re.findall找到字符串中所有不重叠的匹配项,然后将捕获的匹配项的长度除以搜索字符串的长度,得到连续匹配项的数量。例如:

import re

s = 'ATTATTATT GGG ATTATT GGG ATT'
sub = 'ATT'
sl = len(sub)

regex = re.compile(f'((?:{sub})+)')

lens = [len(m) // sl for m in regex.findall(s)]
print(lens)

输出:

[3, 2, 1]

我认为下面是你想要做的:

sub_string = 'ATT'
string = 'ATTATTATT GGGATTATT GGGATT'

count = tuple(sub.count(sub_string) for sub in string.split(' '))

试试这个

tuple(each.count('ATT') for each in 'ATTATTATT GGG ATTATT GGG ATT'.split(' '))

输出:

(3, 2, 1)