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.tsvperl -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:匹配文件中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Perl正则表达式匹配多行文件与匹配变量如何处理换行

Perl 正则表达式 |如何从文件中排除单词

perl 正则表达式 匹配多行的问题

我应该使用 \d 还是 [0-9] 来匹配 Perl 正则表达式中的数字?

Perl:转义字符串中的特殊字符以匹配正则表达式

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?