Perl匹配和打印数字

时间:2016-02-01 14:53:12

标签: regex perl

我想写一个脚本,它将解析一个文件,提取它可以找到的所有EC编号(酶分类代码)并打印出一个列表。 EC编号如下所示:EC 0.1.2.3或EC6.7.8.9

到目前为止,我的尝试还没有成功 - 现在它打印出文件的全部内容。

#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;

open (IN,"ec.txt") or die "Can't read words file: $!";
while (<IN>) {
    chomp;

    $_ =~ /EC?(\d+)\s*/g;
    print("$_ \n");
}

3 个答案:

答案 0 :(得分:2)

无论匹配是否成功,都打印$_(整行)。

此外,正则表达式仅匹配ECE之后的数字,您不会处理这些点。将/g与单个匹配结合使用也很奇怪 - 它通常用于列表上下文或while条件。

#!/usr/bin/perl
use warnings;
use strict;

while (<DATA>) {
    print "$1.\n" while /EC?\s*([\d.]+)/g;
}

__DATA__
EC 0.1.2.3
EC6.7.8.9
EC 1.2.3 EC4.56.78

如果C不可选,请删除问号。

答案 1 :(得分:0)

你应该改变

$_ =~ /EC?(\d+)\s*/g;
print("$_ \n");

while (/EC\s*((\d+)([.]\d+)){3}/g) {
    print ($1\n);
}

正则表达式允许EC和数字 - 点 - 模式之间的空白字符,然后搜索由三个点分隔的四个数字序列。 while迭代所有匹配并在一行上打印每个匹配,而没有&#34; EC&#34;。

答案 2 :(得分:-3)

不要打印$_。这就是整条路线。请改为打印$1。这是parens ()中的匹配。

试试/EC\s*([0-9.]+)/\d只是数字,而不是点数。你也在寻找点,所以[0-9.]+就可以了。