Regex在Perl中给出了一些错误信息

Regex在Perl中给出了一些错误信息,regex,perl,Regex,Perl,我有一段代码: if ($line =~ /gene_id "([A-Za-z0-9:._]*)";/) { $chromosome{$1} = $chompline[0]; push @{$starts{$1}}, $chompline[3]; push @{$ends{$1}}, $chompline[4]; $strand{$1} = $chompline[6]; $ge

我有一段代码:

if ($line =~ /gene_id "([A-Za-z0-9:._]*)";/) {
            $chromosome{$1} = $chompline[0];
            push @{$starts{$1}}, $chompline[3];
            push @{$ends{$1}}, $chompline[4];
            $strand{$1} = $chompline[6];
            $geneid = $1;
            $line =~ /;transcript_id "([A-Za-z0-9:._]*)";/;
            $transcriptid = $1;
        }
此代码读取以下文件:

scaffold_1  Cufflinks   exon    40478   40618   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
scaffold_1  Cufflinks   exon    40723   40832   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
scaffold_1  Cufflinks   exon    40944   41016   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
scaffold_1  Cufflinks   exon    41667   41728   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
scaffold_1  Cufflinks   exon    42268   42585   .   -   .   gene_id "ppa017353m.g";transcript_id "PAC:17642447";tss_id "TSS3451"
scaffold_1  Cufflinks   exon    43369   43510   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
scaffold_1  Cufflinks   exon    44834   45052   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
scaffold_1  Cufflinks   exon    45195   45261   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
scaffold_1  Cufflinks   exon    47061   47460   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
scaffold_1  Cufflinks   exon    49006   49153   .   +   .   gene_id "ppa023343m.g";transcript_id "PAC:17657390";tss_id "TSS1"
代码适用于除以下行以外的所有行:

scaffold_2  Cufflinks   exon    16897769    16898166    .   -   .   gene_id "ppa018337m.g";transcript_id "PAC:17646596_o.3";tss_id "TSS10299"
scaffold_2  Cufflinks   exon    16899376    16899536    .   -   .   gene_id "ppa018337m.g";transcript_id "PAC:17646596_o.3";tss_id "TSS10299"
例如,我需要以下输出:

ppa023343m.g PAC:17657390
除了我给你看的那些台词之外,它一直都在发生。。。对于这些行,我得到以下结果:

PAC:17646596_o.3 PAC:17646596

这怎么可能呢?

在你的第二个正则表达式中,你说:

$line =~ /;transcript_id "([A-Za-z0-9:._]*)";/;
您允许从a到z和a到z的字符以及所有数字、冒号:、点。和下划线。你的台词里有这样的东西:

transcript_id "PAC:17646596_o.3";
transcript_id "PAC:17646596_o.3";
正则表达式中角色组中的所有内容都在其中,因此它们匹配。有下划线和点,还有更多的字母和数字。您的代码完全按照您的要求执行

也许这个解释有助于你更好地理解它:

如果不希望输出中包含_o.3,请将正则表达式更改为his:

$line =~ /;transcript_id "([A-Za-z0-9:]*)[^"]*";/;
        #                               ^
        #             notice the ) here ends the capture group

您需要转义句点之类的字符,否则它将匹配任何字符。另外,让一个正则表达式根据您发布的代码捕获这两段数据,而不知道您的意图,这样做更有意义:

if ($line =~ /gene_id "([^\"]*)";transcript\_id\s\"(PAC:[^\"]*)\"/ ) {
    $geneid = $1;
    $transcriptid = $2;
}

编辑:指向正则表达式演示的链接:

始终在使用捕获的变量之前验证正则表达式是否成功

$transcriptid = $line =~ /;transcript_id "([\w:.]*)";/
    ? $1
    : warn "transcript_id didn't match: $line";
或者,您也可以将正则表达式匹配联接到单个语句中,因此只需进行一次错误检查:

if ($line =~ /gene_id "([\w:.]*)";transcript_id "([\w:.]*)";/) {
    ($geneid, $transcriptid) = ($1, $2);

    $chromosome{$geneid} = $chompline[0];
    push @{$starts{$geneid}}, $chompline[3];
    push @{$ends{$geneid}}, $chompline[4];
    $strand{$geneid} = $chompline[6];

} else {
    warn "Regex didn't match: $line\n"
}

你发布的代码没有输出任何内容。显示更多代码;是什么产生了输出?@chompline的含义是什么?您可能希望知道[A-Za-z0-9:.uz]与[\w:]相同。OP需要检查正则表达式是否成功,而不仅仅是盲目使用$1。不需要漏掉一个点。在字符类中。