Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python查找字符串中具有特定长度的重复_Python_Regex_Loops_Mismatch - Fatal编程技术网

使用python查找字符串中具有特定长度的重复

使用python查找字符串中具有特定长度的重复,python,regex,loops,mismatch,Python,Regex,Loops,Mismatch,我试图使用该模块查找给定字符串(30个字符)中的非重叠重复(重复子字符串),并满足以下要求: 我只对6-15个字符长的非重叠重复感兴趣 允许1个错误匹配 返回每场比赛的位置 我想到的一种方法是,对于每个可能的重复长度,让python循环通过30char字符串输入。比如说, string = "ATAGATATATGGCCCGGCCCATAGATATAT" #input #for 6char repeats, first one in loop would be for the followin

我试图使用该模块查找给定字符串(30个字符)中的非重叠重复(重复子字符串),并满足以下要求:

  • 我只对6-15个字符长的非重叠重复感兴趣
  • 允许1个错误匹配
  • 返回每场比赛的位置
  • 我想到的一种方法是,对于每个可能的重复长度,让python循环通过30char字符串输入。比如说,

    string = "ATAGATATATGGCCCGGCCCATAGATATAT" #input
    
    #for 6char repeats, first one in loop would be for the following event:
    
    text = "ATAGAT"
    text2 ="(" + text + ")"+ "{e<=1}" #this is to allow 1 mismatch later in regex
    
    string2="ATATGGCCCGGCCCATAGATATAT" #string after excluding text
    
    for x in regex.finditer(text2,string2,overlapped=True):
        print x.span()
    
    #then still for 6char repeats, I will move on to text = "TAGATA"...
    #after 6char, loop again for 7char...
    
    string=“atagattggcccggcccatagatat”#输入
    #对于6char重复,循环中的第一个将用于以下事件:
    text=“ATAGAT”
    
    text2=“(“+text+”)“+”{e我会尝试直接的算法,而不是正则表达式(在本例中,正则表达式非常混乱)

    s=“atagattggcccggcccatagatat”
    def模糊_比较(s1、s2):
    #健康检查
    如果len(s1)!=len(s2):
    返回错误
    差异=0
    对于拉链中的a、b(s1、s2):
    如果a!=b:
    差值+=1
    如果差异>1:
    返回错误
    返回真值
    slen=len(s)#30
    对于范围(6,16)内的l:
    i=0
    
    (i+l*2)你能添加一个输入和期望的输出来让你的问题更清楚吗?谢谢你指出@Kasra AD,我刚刚做了一些编辑,希望现在能更清楚一点。输入是字符串,输出是带位置索引的重复。你没有解释的是“重复”是什么。是“atagatat”重复?如果是,为什么?只有一些字母是重复的。为什么“ggggggggggg”不是重复的?这看起来很重复。什么东西是重复的?@Helene welcome,现在如果你也回答Brionius的问题,我将不胜感激!@Brionius感谢你的回答---很抱歉我错过了GGGG部分,只是做了更多的编辑。是的,这是重复。谢谢@StanislaveShabalin。我试用了你的代码,我同意它比使用正则表达式更清晰。但是我注意到t中间有1个不匹配的“TGGCCC”和“GGCCCA”的重复没有被调用。另外,您建议如何解决冗余问题?因为最长重复的部分区域将被计算为较小的重复。我现在正在处理这些问题,但只想让您保持联系。谢谢。@Helene,“TGGCCC”和“GGCCCA”“与1不匹配的情况下不会被调用"怎么会有1个错配呢?我在开头看到了2个:T&G,在结尾看到了C&A。@StanislavShablin非常感谢您的更新。关于错配,您是对的——我想我太习惯于基因测序的观点了。现在不用担心。我会把您的答案记下来。谢谢。@Helene,没问题,如果有错,请马上问还有什么问题吗!
    s = "ATAGATATATGGCCCGGCCCATAGATATAT"
    
    def fuzzy_compare(s1, s2):
        # sanity check
        if len(s1) != len(s2):
            return False
    
        diffs = 0
        for a, b in zip(s1, s2):
            if a != b:
                diffs += 1
    
            if diffs > 1:
                return False        
    
        return True
    
    slen = len(s) # 30
    for l in range(6, 16):
      i = 0
      while (i + l * 2) <= slen:
        sub1 = s[i:i+l]
        for j in range(i+l, slen - l):
            sub2 = s[j:j+l]
            if fuzzy_compare(sub1, sub2):
                # checking if this could be partial
                partial = False
                if i + l < j and j + l < slen:
                    extsub1 = s[i:i+l+1]
                    extsub2 = s[j:j+l+1]
                    # if it is partial, we'll get it later in the main loop
                    if fuzzy_compare(extsub1, extsub2):
                       partial = True
    
                if not partial: 
                    print (i, i+l), (j, j+l)
    
        i += 1