【问题标题】:Return lengths of repeating substring返回重复子串的长度
【发布时间】:2021-07-30 06:02:37
【问题描述】:

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

示例:对于子字符串ATT 和字符串ATTATTATT GGG ATTATT GGG ATT,我想返回(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)

有没有更快、更简单的方法来实现这一点?

【问题讨论】:

  • ATTGGGATTATT GGGATT 这样的字符串可能吗?如果是这样,您的预期结果是什么?
  • @Nick,出于习惯,我在字符串中留下了空格。任何字符串中都没有空格。您提到的字符串是可能的,如果固定子字符串是 ATT,则预期结果是 (1,2,1)。如果固定子串是 GGG,则预期结果将是 (1,1)。编辑:也就是说,空格不应该影响任何东西,因为无论如何找到子字符串的算法都应该跳过空格。

标签: python python-3.x string substring itertools


【解决方案1】:

您可以使用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]

【讨论】:

  • 这正是我需要它做的,而不依赖于分隔空格(可能在字符串中也可能不在字符串中——我的例子可能具有误导性)。谢谢。
  • @ichthyophile 不用担心 - 我很高兴能提供帮助。
【解决方案2】:

试试这个

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

输出:

(3, 2, 1)

【讨论】:

  • 我想我会期待与'ATTGGGATTATT'不同的东西
  • @Mark,你是对的。如果需要,我需要能够忽略空格。像你说的应该返回 (1,2)。
【解决方案3】:

我认为以下是您想要做的:

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

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

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 2017-03-30
    • 2020-07-12
    • 2016-06-29
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多