【问题标题】:Perl match and print numbersPerl 匹配和打印数字
【发布时间】:2016-02-01 23:13:33
【问题描述】:

我想编写一个脚本,该脚本将解析一个文件,提取它可以找到的所有 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");
}

【问题讨论】:

  • 您不允许使用空格和点。
  • 请添加一些示例输入和预期结果。

标签: regex perl


【解决方案1】:

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

此外,正则表达式仅匹配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 不是可选的,请删除问号。

【讨论】:

  • 我认为EC? 应该是EC。 OP 没有说 C 是可选的,我想他们正在使用 ? 来匹配可选空间
  • C 不是可选的。感谢您的帮助。
  • 如果你不使用if而不是while,它不会对输出产生影响,但它更有意义。
  • @123 在这里的最后一行有所不同。
  • @choroba 哦,是的,没注意到,以为是每行一个。
【解决方案2】:

你应该改变

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

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

正则表达式将允许 EC 和数字点模式之间的空白字符,然后搜索由三个点分隔的四个数字序列。 while 遍历所有匹配项并将每个匹配项打印在一行上,不带“EC”。

【讨论】:

    【解决方案3】:

    不要打印$_。这就是整条线。改为打印$1。那是括号中的匹配()

    试试/EC\s*([0-9.]+)/\d 只是数字,不是点。您也在搜索点,所以[0-9.]+ 可以解决问题。

    【讨论】: