匹配并索引所有子字符串,包括重叠的子字符串
Match and index all substrings, including overlapping ones
我正在尝试使用 new regex findall 为匹配项编制索引,以便可以考虑重叠的匹配项。但是,我只能找到匹配项,但不能正确地给出它们的位置。
我的代码:
import regex as re
seq = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring="GTTTGCAG"
xx=re.findall(substring,seq,overlapped=True)
print xx
xx 看起来像
['GTTTGCAG', 'GTTTGCAG']
因为10-17和25-32位置有两场比赛
但是请问我怎样才能得到这些数字呢?通过检查 dir(xx),没有 start/end/pos 我可以在这个新函数中使用。 (我尝试了 xx.index(substring),但这似乎只给出了结果列表的索引:例如,在这种情况下为 0 和 1)
谢谢。
使用re.finditer,您可以获得起始位置:
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
结果:
[[12, 16], [14, 18], [26, 30]]
['LALA', 'LALA', 'LALA']
使用您的原始示例的结果:
[[9, 17], [24, 32]]
['GTTTGCAG', 'GTTTGCAG']
在子字符串搜索中添加“?=”告诉正则表达式下一个匹配项可以使用上一个匹配项中的字符
如果您不使用正则表达式,您可以使用可选的起始参数重复调用 string.find()
。
例如:
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])
输出:
(9, 17, 'GTTTGCAG')
(24, 32, 'GTTTGCAG')
注:(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)
输出:
[('GTTTGCAG', 9, 17), ('GTTTGCAG', 24, 32)]
我正在尝试使用 new regex findall 为匹配项编制索引,以便可以考虑重叠的匹配项。但是,我只能找到匹配项,但不能正确地给出它们的位置。
我的代码:
import regex as re
seq = "ATCCAAGGAGTTTGCAGAGGTGGCGTTTGCAGCATGAGAT"
substring="GTTTGCAG"
xx=re.findall(substring,seq,overlapped=True)
print xx
xx 看起来像
['GTTTGCAG', 'GTTTGCAG']
因为10-17和25-32位置有两场比赛
但是请问我怎样才能得到这些数字呢?通过检查 dir(xx),没有 start/end/pos 我可以在这个新函数中使用。 (我尝试了 xx.index(substring),但这似乎只给出了结果列表的索引:例如,在这种情况下为 0 和 1)
谢谢。
使用re.finditer,您可以获得起始位置:
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
结果:
[[12, 16], [14, 18], [26, 30]]
['LALA', 'LALA', 'LALA']
使用您的原始示例的结果:
[[9, 17], [24, 32]]
['GTTTGCAG', 'GTTTGCAG']
在子字符串搜索中添加“?=”告诉正则表达式下一个匹配项可以使用上一个匹配项中的字符
如果您不使用正则表达式,您可以使用可选的起始参数重复调用 string.find()
。
例如:
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])
输出:
(9, 17, 'GTTTGCAG')
(24, 32, 'GTTTGCAG')
注:(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)
输出:
[('GTTTGCAG', 9, 17), ('GTTTGCAG', 24, 32)]