使用python查找字符串中具有特定长度的重复
我试图使用该模块查找给定字符串(30个字符)中的非重叠重复(重复子字符串),并满足以下要求:使用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
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