Perl:匹配文件中的正则表达式
Perl: match regex from the file
我有一个制表符分隔的文件,其中包含有关项集的信息。每个项目集由一到三个项目组成:
MTMR14_Q1 NOTCH1_Q3 PRKCD_Q1
MTMR14_Q1 NOTCH1_Q3 TFRC_Q3
MTMR14_Q1 NOTCH1_Q3
MTMR14_Q1
MTMR14_Q1 PASD1_Q3
我的目标是检索仅包含三个项目的项目集:
MTMR14_Q1 NOTCH1_Q3 PRKCD_Q1
MTMR14_Q1 NOTCH1_Q3 TFRC_Q3
我编写了以下代码,但它没有检索任何项集:
#!/usr/bin/perl -w
use strict;
my $input = shift @ARGV or die $!;
open (FILE, "$input") or die $!;
while (<FILE>) {
my $seq = $_;
chomp $seq;
if ($seq =~ /[A-Z]\t[A-Z]\t[A-Z]/) {
#using the binding operator to match a string to a regular expression
print $seq . "\n";
}
}
close FILE;
你能指出我的错误吗?
[A-Z]
匹配单个字母。
跳过不完全包含 3 个字段的行:
next if $seq !~ /^ [^\t]* \t [^\t]* \t [^\t]* \z/x;
[^\t]*
匹配任意数量的非制表符。
跳过不完全包含 3 个非空字段的行:
next if $seq !~ /^ [^\t]+ \t [^\t]+ \t [^\t]+ \z/x;
[^\t]+
匹配任何一个或多个非制表符。
据推测,您将通过解析行来获取三个字段来跟进。如果是这样,您可以先解析然后检查,如下所示:
my @fields = split /\t/, $seq, -1;
next if @fields != 3; # Require exactly 3 fields.
next if ( grep length, @fields ) != 3; # Requite exactly 3 non-empty fields.
我有一个制表符分隔的文件,其中包含有关项集的信息。每个项目集由一到三个项目组成:
MTMR14_Q1 NOTCH1_Q3 PRKCD_Q1
MTMR14_Q1 NOTCH1_Q3 TFRC_Q3
MTMR14_Q1 NOTCH1_Q3
MTMR14_Q1
MTMR14_Q1 PASD1_Q3
我的目标是检索仅包含三个项目的项目集:
MTMR14_Q1 NOTCH1_Q3 PRKCD_Q1
MTMR14_Q1 NOTCH1_Q3 TFRC_Q3
我编写了以下代码,但它没有检索任何项集:
#!/usr/bin/perl -w
use strict;
my $input = shift @ARGV or die $!;
open (FILE, "$input") or die $!;
while (<FILE>) {
my $seq = $_;
chomp $seq;
if ($seq =~ /[A-Z]\t[A-Z]\t[A-Z]/) {
#using the binding operator to match a string to a regular expression
print $seq . "\n";
}
}
close FILE;
你能指出我的错误吗?
[A-Z]
匹配单个字母。
跳过不完全包含 3 个字段的行:
next if $seq !~ /^ [^\t]* \t [^\t]* \t [^\t]* \z/x;
[^\t]*
匹配任意数量的非制表符。
跳过不完全包含 3 个非空字段的行:
next if $seq !~ /^ [^\t]+ \t [^\t]+ \t [^\t]+ \z/x;
[^\t]+
匹配任何一个或多个非制表符。
据推测,您将通过解析行来获取三个字段来跟进。如果是这样,您可以先解析然后检查,如下所示:
my @fields = split /\t/, $seq, -1;
next if @fields != 3; # Require exactly 3 fields.
next if ( grep length, @fields ) != 3; # Requite exactly 3 non-empty fields.