我目前在一个文件中有一个基因列表。每条线都有一个带有它的信息的染色体。这样的条目显示为:
NM_198212 chr7 + 115926679 115935830 115927071 11593344 2 115926679,'115933260', 115927221,'115935830' ,
染色体的序列从碱基 115926679 开始,一直延伸到(但不包括)碱基 115935830
如果我们想要拼接序列,我们使用外显子。第一个扩展自 115926679 到 155927221,第二个从“115933260”到“115935830”
但是,我在处理互补序列时遇到了一个问题,例如:
NM_001005286 chr1 - 245941755 245942680 245941755 245942680 1 245941755, '245942680'
由于第 3 列是“-”,这些坐标引用反义链(链的互补链)。第一个碱基(粗体)与有义链上的最后一个碱基(斜体)匹配。由于文件只有sense stand,我需要尝试将anti-sense strand上的坐标翻译成sense strand,挑出正确的序列然后反向互补。
也就是说,我只做了大约半年的编程,而且不确定如何开始做这件事。
我写了一个正则表达式:
'(NM_\d+)\s+(chr\d+)([(\+)|(-)])\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+),(\d+),s+(\d+),(\d+),'
但我现在不确定如何启动此功能... 如果有人可以帮助我开始这方面的工作,也许让我知道如何做到这一点,我将非常感激。
好的:假设这是 25 号染色体:
AAAAAAAAAACCCCCCCCCCTTTTTTTTTTGGGGGGGGGG
(每个字符有 10 个)。
现在:如果我正在寻找一个未剪接的基因:chr25 + 10 20
然后基因从第 10 位开始(从 0 开始),上升到但不包括第 20 位。所以它:
CCCCCCCCCC
这很简单。它非常适合 python 字符串切片。
如果我给你它更令人困惑:
chr25 - 10 20
您拥有的是正链。但是这个基因在负(互补)链上。记住染色体作为双链时的样子:
AAAAAAAAAACCCCCCCCCCTTTTTTTTTTGGGGGGGGGG
TTTTTTTTTTGGGGGGGGGAAAAAAAAAACCCCCCCCCCC
我们正在寻找底部链上的基因。意思是我们从右边开始从 0 开始计数。从左开始对顶部链进行编号,从右侧对底部链进行编号。所以我在这里想要的是 AAAAAAAAAA。
要注意的是,我只给你最上面的部分。我不会给你最底层的信息。 (你可以从顶链生成你自己——但考虑到它有多大,我建议不要这样做。)
所以需要转换坐标。在底部链上,碱基 0(最右边的 C)与顶部链上的碱基 39 相对。基数 1 与基数 38 相对。基数 2 与情况 37 相对。(重要的一点:注意每次将这两个数字相加时会发生什么。)因此基数 10 与基数 29 相对,基数 19 与基数 20 相对。
所以:如果我想在底部链上找到基数 10-20,我可以查看顶部的基数 20-29(然后对其进行反向补码)。
我需要弄清楚如何将底部链上的坐标转换为底部链上的等效坐标。是的:非常困惑
我试过 weronika's original answer :
fields = line.split(' \t')
geneID, chr, strand = fields[:2]
start = int(fields[3])
end = int(fields[4])
if strand == '-':
start,end = -(start + 1), -(end + 1) # this part was changed from original answer.
这是在正确的轨道上,但还不够。这会将 10 和 20 变成 20 和 10。
而且我知道我可以通过这样做反向补充字符串:
r = s[::-1]
bc = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
l = list(r)
o = [bc[base] for base in l]
return ''.join(o)
已编辑!这看起来正确吗?!
fp2 = open('chr22.fa', 'r')
fp = open('chr22.fa', 'r')
for line in fp2:
newstring = ''
z = line.strip()
newstring += z
for line in fp:
fields = line.split('\t')
gene_ID, chr, strand = fields[:2]
start = int(fields[3])
end = int(fields[4])
bc = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A', 'a': 't', 't': 'a', 'c':'g', 'g':'c', 'N':'N', 'n':'n'}
l = list(newstring)
if strand == '+':
geneseq = ''.join([bc[base] for base in l[start:end]])
if strand == '-':
newstart, newend = -(start + 1), -(end + 1)
genseq = ''.join([bc[base] for base in l[newstart:newend]])
最佳答案
如果您用负数对字符串进行切片,Python 会从末尾倒数。
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
s = "AAAAAAAAAACCCCCCCCCCTTTTTTTTTTGGGGGGGGGG"
"".join(complement[c] for c in s[-20:-10])
编辑:
您的编辑对我来说似乎是正确的,是的。我很不擅长检查 fencepost errors ,但无论如何,你比我更有资格看到这些!
我已经重写了您的代码,使其更符合 Pythonic,但没有做任何实质性的改变。
bc = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A', 'N':'N'}
f = open('chr22.fa')
l = ''.join(line.strip() for line in f)
f.seek(0)
for line in f:
fields = line.split('\t')
gene_ID, chr, strand = fields[:2]
start = int(fields[3])
end = int(fields[4])
if strand == '-':
start, end = -(start + 1), -(end + 1)
geneseq = ''.join(bc[base.upper()] for base in l[start:end])
关于python - 匹配文件中的部分行(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10262838/