繁体   English   中英

在不匹配(“N”)的参考上查找字符串(DNA 序列)的 position

[英]Find position of string (DNA sequence) on reference with mismatches (“N”)

我试图沿着基因组 alignment 找到一个不连续的引发区域的开始和结束位置,所以基本上有 2 个区域。 这是一个简化的示例:

genome = "GCTAGCTAGCTAGCTGACGCGATCGATGCTAGTTTCGGTGCGCTtAAAAAAGCTTGCATGAAGGCTAGCTA"
primer = "AGCTGANNNNNTCGATGC"

这将像这样对齐:

基因组上启动区域的比对

我需要在这个启动区域所在的基因组上找到开始和结束 position。

我尝试通过拆分 N 的位置来简单地将其作为字符串来执行,如下所示:

regions = primer.split('N')
start = genome.find(regions[0])
end = genome.find(regions[-1]) + len(regions[-1])

这样做的问题是,在大型基因组 alignment 上,通常会有较短区域的重复,所以我最终得到了错误的位置。 据我所知,BioPython 中没有任何东西可以做到这一点,pairwise2 也没有办法返回开始和结束位置。

谢谢你。

如果没有正则表达式,您可以通过这种方式解决此任务:

genome = "GCTAGCTAGCTAGCTGACGCGATCGATGCTAGTTTCGGTGCGCTtAAAAAAGCTTGCATGAAGGCTAGCTA"
primer = "AGCTGANNNNNTCGATGC"

prefix, suffix = primer[:primer.find("N")], primer[primer.rfind("N") + 1:]

start_pos = end_pos = -1
while True:
    start_pos = genome.find(prefix, start_pos + 1)
    end_pos = start_pos < 0 and start_pos or genome.find(suffix, start_pos + len(prefix)) + len(suffix)
    if start_pos < 0 or end_pos - start_pos == len(primer):
       break

print(start_pos, end_pos)

使用正则表达式:

import re
...

pattern = re.compile(primer.replace("N", "."))
match = pattern.search(genome)
if match:
    start_pos, end_pos = match.span()
    print(start_pos, end_pos)

要以问题的格式打印它,请使用下一个代码:

print(genome)
print(" " * start_pos + "|" * len(prefix) + "." * (len(primer) - len(suffix) - len(prefix)) + "|" * len(suffix))
print("-" * start_pos + primer + "-" * (len(genome) - end_pos))

您也可以简单地使用正则表达式。

import re

genome = "GCTAGCTAGCTAGCTGACGCGATCGATGCTAGTTTCGGTGCGCTtAAAAAAGCTTGCATGAAGGCTAGCTA"
primer = "AGCTGANNNNNTCGATGC"

#create regular expression from primer
reg = '[A-Z]+'.join([i for i in primer.split('N') if len(i)>0])

#Search for index where regular expression matches
idx = re.search(reg, genome).span()

#Output = (11,29) which is start and end of the match

#print both with primer aligned based on start to end index of match
print(genome)
print(''.join((['_']*idx[0])+list(primer)+(['_']*(len(genome)-idx[1]))))
GCTAGCTAGCTAGCTGACGCGATCGATGCTAGTTTCGGTGCGCTtAAAAAAGCTTGCATGAAGGCTAGCTA
___________AGCTGANNNNNTCGATGC__________________________________________

regex101.com上测试的正则表达式

在此处输入图像描述

import re

genome = "GCTAGCTAGCTAGCTGACGCGATCGATGCTAGTTTCGGTGCGCTtAAAAAAGCTTGCATGAAGGCTAGCTA"
primer = "AGCTGANNNNNTCGATGC"

split = re.split('N+', primer)
middle = len(primer)-len(''.join(split))

r = f'{split[0]}\w{{{middle}}}{split[-1]}'

re.finditer(r,genome)

# Taking index 0 here assuming there will be one match
# If there are multiple matches handle the printing by looping perhaps
pos = [(m.start(0), m.end(0)) for m in re.finditer(r, genome)][0]

print(genome)
print(' '*pos[0] + '|'*len(split[0]) + '.'*middle + '|'*len(split[-1]))
print('-'*pos[0] + primer + '-'*int(len(genome)-int(pos[0]+len(primer))))

Output

GCTAGCTAGCTAGCTGACGCGATCGATGCTAGTTTCGGTGCGCTtAAAAAAGCTTGCATGAAGGCTAGCTA
           ||||||.....|||||||
-----------AGCTGANNNNNTCGATGC------------------------------------------

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM