如何使用Perl正则表达式从等式中提取具有非零系数的变量?

时间:2016-10-18 04:46:46

标签: regex perl

我希望获得特定数字排列的非零系数。我在下面有一组数字,我希望用正则表达式从

中提取非零系数(x2x3x5
x1 *0.000000+ x2 *-0.100000+ x3 *0.850000+ x4 *0.000000+ x5 *0.000056+ x6 *0.000000 

我试过这个

(\*[-+]?[0]*\.?[0]+)

但我不确定是否应该考虑"*0.000000"

3 个答案:

答案 0 :(得分:5)

匹配x-digit 而不是,后跟space-star-zero-dot-zeroes-endOfWord:

x\d+(?! \*0\.0+\b)

请参阅live demo

答案 1 :(得分:3)

我建议您使用完整的编程语言来简化正则表达式以捕获所有系数,然后使用grep消除零:

#!/usr/bin/env perl

use strict;
use warnings;

my $eqn = "x1 *0.000000+ x2 *-0.100000+ x3 *0.850000+ x4 *0.000000+ x5 *0.000056+ x6 *0.000000 ";

my %eqn = ($eqn =~ /(x[0-9]+) \s [*] (-?[0-9.]+) [+]/gx);

print "$_\n" for grep $eqn{$_} != 0, keys %eqn;

输出(除非您对变量名称进行排序,否则顺序将不一致):

x3 
x5 
x2

这可能看起来太多额外的工作,但将方程式解析为将变量映射到系数的哈希值实际上可以根据您正在做的事情的确切性质来保存您的工作。我假设您正在根据系数幅度进行某种模型选择。

答案 2 :(得分:2)

执行:

x\d+(?!\s*\*0\.0*(?:[+\s]|$))
  • x\d+获取x后跟一个或多个数字
  • 零宽度负前瞻模式(?!\s*\*0\.0*(?:[+\s]|$))可确保匹配后不会出现零效率

Demo

更强大,避免在比赛中出现误报:

x\d+(?!\s*\*0\.0*(?:[+\s]|$))(?=\s*\*-?\d+(?:\.\d*)?(?:[+\s]|$))

Demo