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)
对于给定的子字符串,我需要按顺序确定给定字符串中该子字符串的重复链的所有长度。
例子:对于子字符串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)