Perl:匹配文件中的正则表达式
Posted
技术标签:
【中文标题】Perl:匹配文件中的正则表达式【英文标题】:Perl: match regex from the file 【发布时间】:2022-01-11 18:23:13 【问题描述】:我有一个制表符分隔的文件,其中包含有关项集的信息。每个项目集由一到三个项目组成:
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;
能否请您指出我的错误?
【问题讨论】:
您只匹配单个大写字符,没有重复、空格或_
匹配一个或多个字符,/^[^\t]+\t[^\t]+\t[^\t]+$/
一个衬垫:awk 'NF == 3' input.tsv
或 perl -lane 'print if @F == 3' input.tsv
@Shawn 那些在空格上拆分,而不是在制表符上。我不知道如何调整 awk 的,但是 Perl 的可以通过添加 -F'\t'
来修复
@ikegami 我把它省略了,因为它与 OP 的样本数据没有区别。 (猜猜 perl 是从什么语言/程序提升 -F
的?)
【参考方案1】:
[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.
【讨论】:
以上是关于Perl:匹配文件中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章