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。不需要漏掉一个点。在字符类中。