Python 查找multifasta文件中的所有图案,包括重叠的图案

Python 查找multifasta文件中的所有图案,包括重叠的图案,python,perl,Python,Perl,我有一个multifasta文件,它看起来像这样: >NP_001002156.1 MKTAVDRRKLDLLYSRYKDPQDENKIGVDGIQQFCDDLMLDPASVSVLIVAWKFRAATQCEFSRQEFLDG MTDLGCDSPEKLKSLLPRLEQELKDSGKFRDFYRFTFSFAKSPGQKCLDLEMAVAYWNLILSGRFKFLGL WNTFLLEHHKKSIPKDTWNLLLDFGNMIADDMSNYAEEGAWPVLIDDFVEFARPIVTAENLQT

我有一个multifasta文件,它看起来像这样:

>NP_001002156.1
MKTAVDRRKLDLLYSRYKDPQDENKIGVDGIQQFCDDLMLDPASVSVLIVAWKFRAATQCEFSRQEFLDG
MTDLGCDSPEKLKSLLPRLEQELKDSGKFRDFYRFTFSFAKSPGQKCLDLEMAVAYWNLILSGRFKFLGL
WNTFLLEHHKKSIPKDTWNLLLDFGNMIADDMSNYAEEGAWPVLIDDFVEFARPIVTAENLQTL
>NP_957070.2
MAKDAGLKETNGEIKLFINQSPGKAAGVLQLLTVHPASITTVKQILPKTLTVTGAHVLPHMVVSTPQRPT
IPVLLTSPHTPTAQTQQESSPWSSGHCRRADKSGKGLRHFSMKVCEKVQKKVVTSYNEVADELVQEFSSA
DHSSISPNDAVSSCHVYDQKNIRRRVYDALNVLMAMNIISKDKKEIKWIGFPTNSAQECEDLKAERQRRQ
ERIKQKQSQLQELIVQQIAFKNLVQRNREVEQQSKRSPSANTIIQLPFIIINTSKKTIIDCSISNDKFEY
LFNFDSMFEIHDDVEVLKRLGLALGLESGRCSAEQMKIATSLVSKALQPYVTEMAQGSVNQPMDFSHVAA
ERRASSSTSSRVETPTSLMEEDEEDEEEDYEEEDD
>NP_123456.1
MALLLLLGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
...
虽然有一个很好的python脚本来处理multifasta文件()中的motif搜索,但如果使用了模式“[KHR]{3}”, 它将只返回motif列表和许多空结果:

>NP_001002156.1
:['RRK']
>NP_001002156.1
:[]
>NP_001002156.1
:['HHK']
>NP_957070.2
:[]
>NP_957070.2
:['RRR']
...
一些motif(HKK)在同一序列中泄漏

在这里,我找到了另一个python脚本:

#coding:utf-8
import re
pattern = "[KHR]{3}"
with open('seq.fasta') as fh:
    fh.readline() 
    seq = ""
    for line in fh:
         seq += line.strip() 
rgx = re.compile(pattern)
result = rgx.search(seq)
patternfound = result.group()
span = result.span()
leftpos = span[0]-10
if leftpos < 0:
   leftpos = 0
print(seq[leftpos:span[0]].lower() + patternfound + seq[span[1]:span[1]+10].lower())
但它没有文件头“>NP001002156.1”和上下文中的其他两个主题均为:

glwntfllehHHKksipkdtwnl
lwntfllehhHKKsipkdtwnll
在这里,我希望所需的脚本返回匹配的motif及其在每个fasta上下文中的位置 序列,它将显示以下结果:

>NP_001002156.1_matchnumber_1_(7~9)
mktavdrRRKldllysrykd
>NP_001002156.1_matchnumber_2_(148~150) 
glwntfllehHHKksipkdtwnl
>NP_001002156.1_matchnumber_3_(149~151)
lwntfllehhHKKsipkdtwnll
>NP_957070.2_matchnumber_1_(163~165)
chvydqknirRRRvydalnvlma
>NP_123456.1
no match found
注: 匹配模式的位置不是语境的位置

有人能帮我吗?提前感谢。

这里的“主题”是[HKR]字符的任意三个长组合;图案可能重叠

通过在正则表达式中使用“前瞻”来解决重叠问题。详情见下文。引用或显示的资源似乎都不能处理这个问题,我不知道它们如何捕捉重叠的主题

use warnings;
use strict;
use feature 'say';

my $file = shift || die "Usage: $0 fasta-file\n";    
open my $fh, '<', $file or die "Can't open $file: $!";

my ($seq, $seq_name);
while (<$fh>) {
    chomp;
    if (/^>(.*)/) {
        # Process the previous assembled sequence
        if ($seq) {
            proc_seq($seq_name, $seq);
            $seq = ''; 
        }
        $seq_name = $1; 
        next;
    }   
    $seq .= $_; 
}
# Process the last one    
proc_seq($seq_name, $seq);

sub proc_seq {
    my ($seq_name, $seq, $multiline) = @_; 

    # Build output in the loop, as motifs are found. By default, print all
    # output for one seq_name in one line. To print each motif on its own
    # line instead, invoke this sub with a true third argument (1 will do).
    my $output = ">$seq_name";

    my $cnt = 0;
    while ($seq =~ /([HKR])(?=([HKR]{2}))/g) { 
        ++$cnt;
        my $motif = $1 . $2; 
        my $pos = pos($seq);
        my $pre_context = ($pos >= 11) 
            ? substr($seq, $pos-11, 10) 
            : substr($seq, 0,       $pos-1);
        my $post_context = substr $seq, $pos+2, 10;

        $output .= " n$cnt($pos~" . ($pos+2) . ") ";
        $output .= "\n"  if $multiline;
        $output .= lc($pre_context) . $motif . lc($post_context);
    } 
    say ($cnt > 0  ? $output  : $output . ' no match found');
}
根据需要,在一行上显示相同序列名称的所有图案。我在输入中添加了一个不带图案的伪行,以测试
未找到匹配项的添加;这画出了上面输出的最后一行


仍然有一个选项可以将每个motif打印在单独的行上,正如最初所希望的那样:使用附加的第三个参数调用
proc_seq
函数,该参数为true,如

proc_seq($seq_name, $seq, 1)
然后它会打印出来

>NP_001002156.1 n1(7~9) mktavdRRKldllysrykd n2(148~150) lglwntflleHHKksipkdtwnl n3(149~151) glwntfllehHKKsipkdtwnll >NP_957070.2 n1(163~165) schvydqkniRRRvydalnvlma >NP_bogus_with_no_motifs no match found >NP001002156.1 n1(7~9) mktavdRRKldllysrykd n2(148~150) LGLWntflehkksipkdtwnl n3(149~151) GLWntflehkksipkdtwnll >NP_957070.2 n1(163~165) Schvydqknirrvydalnvlma >NP_伪_与_无_图案未找到匹配项
那么什么是“母题”?三个字母的图案?为什么在一个例子中是“RRK”,但在另一个例子中是HHK,在下一个例子中是HKK,在上一个例子中是RRR?你能解释一下吗?(或者你只想让知道这一点的人回答吗?)。。。[HKR]中的任何三个字符组合?这些文件有多大?@zdim它将不仅仅是HKR或其他模式,它将有所不同,我们必须查看蛋白质折叠和蛋白质特性。蛋白质序列不像DNA序列,所以蛋白质的最大大小为~50K个字符。但在文件中,我们可以保留n个序列,Fasta序列头以
>
@zdim开头,Regex模式语法可以用于搜索任何字符串中的预定义模式,这个例子就是蛋白质序列。文件大小约为40Mb,谢谢@james还详细解释了答案中的正则表达式如何捕捉重叠的主题。(注意,当然还有其他方法。)@james Welcome:)我只是为一个“边缘大小写”固定了数字(当匹配前字符串中没有足够的字符时,打印10作为上下文-它被1关闭)@james如果您愿意,请在函数开头添加一个标志(
my$cnt=0;
),并在
while
循环中增加它,以便在有匹配项时。在
while
循环之后,检查该变量,如果该变量仍然为零,则没有找到匹配项,您可以打印该变量。@james这现在是一个可变的motif长度?然后你得看看你在第二次抓捕中得到了多少。
$pos+2
现在已经存在,因为在问题的示例中,我们总是有两个以上的字符(在第一个字符之后)。如果不固定,则取长度:
$pos+length($2)
。(或者,因为这将被多次使用,所以首先将其存储在变量中。)@james Editing。。。一旦我们找到了它,一个问题是:以某种方式排列输出是否有用——例如,使其成为专栏?这似乎无关紧要,因为可以有许多不同的位置/数量的图案,但如果有,很容易添加。
proc_seq($seq_name, $seq, 1)
>NP_001002156.1 n1(7~9) mktavdRRKldllysrykd n2(148~150) lglwntflleHHKksipkdtwnl n3(149~151) glwntfllehHKKsipkdtwnll >NP_957070.2 n1(163~165) schvydqkniRRRvydalnvlma >NP_bogus_with_no_motifs no match found