匹配并索引所有子字符串,包括重叠的子字符串

2024-10-02 04:30:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用new regex findall索引匹配项,以便可以考虑重叠的匹配项。但是,我只能找到匹配项,但不能正确地给出它们的位置。在

我的代码:

import regex as re
seq = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring="GTTTGCAG"
xx=re.findall(substring,seq,overlapped=True)
print xx

xx看起来像

^{pr2}$

因为在10-17和25-32位置有两场比赛。在

但是我怎样才能得到这些号码?通过检查dir(xx),在这个新函数中没有start/end/pos可以使用。(我试过了二十、索引(子字符串),但这似乎只给出结果列表的索引:例如,在本例中是0和1)

谢谢。在


Tags: 代码importretruenewassubstringseq
3条回答

使用芬代尔,您可以获得起始位置:

import re
seq = "blahblahblahLALALAblahblahLALA"
substring="LALA"
lenss=len(substring)
overlapsearch="(?=(\\"+substring+"))"
xx=[[x.start(),x.start()+lenss] for x in list(re.finditer(overlapsearch,seq))]
check=[seq[x[0]:x[1]] for x in xx]
print xx
print check

结果:

^{pr2}$

以及使用原始示例得到的结果:

[[9, 17], [24, 32]]
['GTTTGCAG', 'GTTTGCAG']

添加“?=“to substring search告诉regex下一个匹配项可以使用上一个匹配项中的字符

如果不使用正则表达式,可以使用可选的start参数反复调用^{}。在

例如:

sequence = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring="GTTTGCAG"

def find_endpoints(seq, sub):
    off = 0
    matches = []
    while True:
        idx = seq.find(substring, off)
        if idx == -1: break
        matches.append((idx, idx+len(sub)))
        off = idx + 1
    return matches

for (s,e) in find_endpoints(sequence, substring):
    print(s, e, sequence[s:e])

输出:

^{pr2}$

注意:(s,e)是子字符串的开始索引(包括索引)和结束索引(不包括索引)。在

对长度相等的子串进行迭代,并与我们的模式进行比较。如果它们是相同的,它会记住字符串中的起始和结束索引。简单的列表理解。在

sequence = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring = "GTTTGCAG"

def find_indexes(seq, sub):
    return [(sub, i, len(sub)+i) for i in range(0, len(seq), 1) if seq[i:len(sub)+i] == sub]

print find_indexes(sequence, substring)

输出:

^{pr2}$

相关问题 更多 >

    热门问题