python - 匹配文件中的部分行(python)

标签 python regex bioinformatics fasta complement

我目前在一个文件中有一个基因列表。每条线都有一个带有它的信息的染色体。这样的条目显示为:

NM_198212 chr7 + 115926679 115935830 115927071 11593344 2 115926679,'115933260', 115927221,'115935830' ,

染色体的序列从碱基 115926679 开始,一直延伸到(但不包括)碱基 115935830

如果我们想要拼接序列,我们使用外显子。第一个扩展自 115926679155927221,第二个从“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/

相关文章:

java - 正则表达式问题

java - 正则表达式:是否可以跳过重复的负向后查找?

python - 替换 pandas 数据框中的字符串

php - 需要可变宽度负向后查找替换

Python:for循环中的下一个

python - 在 Matplotlib 中注释时间序列图

python将字典值修改为另一个字典

c++ - 如何拆分字符串并在 C++ 中得到我想要的?

java - hadoop mapreduce : handling a text file with a header

python - django:避免在 get_or_create 上出现 "Unused variable"警告