Perl正则表达式提取浮点数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl正则表达式提取浮点数相关的知识,希望对你有一定的参考价值。

我需要修改某人的Perl脚本,而我根本不熟悉Perl。

有一个标量变量$var,其值是浮点数,可能后跟垃圾。我需要提取浮点数。

该数字采用非指数格式:DDD [.DDD],没有任何符号。

分数部分可能会丢失。整数部分不缺少(.123只是垃圾)

如果变量以垃圾(特别是符号或小数点)开头,我需要提取空字符串。

例子:

-123.456 ==> ""
123. ==> "123"
123.456.789 ==> "123.456"
123.456junk ==> "123.456"
123junk ==> "123"
123.junk ==> "123"     # strip the dot if no fraction
.123 ==> ""
junk ==> ""
000.000 ==> "000.000"

有人可以提供解决方案,我想它应该是:$var =~ s/REGEX_EXPRESSION,但我无法弄清楚REGEX_EXPRESSION应该是什么。

谢谢。

答案

更新后,您需要的表达式是:

^d+(?:.d+)?
  • ^d+在字符串开头匹配数字。
  • (?:开始非捕获组。
  • .d+匹配文字.,后跟数字。
  • )?关闭非捕获组,使其成为可选项。

检查表达式here

Perl示例:

$var = "123.456.789";
print "old $var
";
$var =~ /(^d+(?:.d+)?)/;
print "new $1
";

打印:

old 123.456.789
new 123.456
另一答案

所以我正在尝试建议的表达式,我想我没有在Perl中正确使用它们:

my $var = "123.456.66";
print "old $var
";
$var =~ s/^d+(?:.d+)?//;
print "new $var
";

输出:

$perl main.pl
old 123.456.66
new .66
另一答案

据我了解,您需要从字符串中提取前一个或两个数字组。像这样。

123.456.789  # 123.456
123.456abc   # 123.456
123abc       # 123
abc123       # nothing

正则表达式看起来像这样,扩展出来以获得更好的解释。

qr{
  (
    d+ 
    (?: .d+ )?
  )
}x;

qr是正则表达式引用运算符。使用x意味着忽略空格,因此事物更具可读性。

d匹配数字。 +说要匹配前面的一个或多个。所以d+是1位或更多位数。

()捕获内容。

(?:)对内容进行分组但未捕获。

?说要捕获前面的0或1。这意味着它是可选的。

所以(?: .d+ )?意味着一个点后跟一些数字是可选的。

你会这样使用它。

my $str = "123.456abc";
my $digits_re = qr{ (d+ (?: .d+ )?) }x;
my($digits) = $str =~ $digits_re;
print $digits;

有关更多信息,请参阅Perl Regex Tutorial,您可以在Regex 101上玩它。

以上是关于Perl正则表达式提取浮点数的主要内容,如果未能解决你的问题,请参考以下文章

用于浮点数或 int 的 Python 正则表达式,而不是将浮点数分成两个浮点数

关于浮点数的正则表达式?

从php中的字符串中提取正负浮点数

用于匹配浮点数的正则表达式

在 Perl 中创建正则表达式以提取值

正则表达式从逗号分隔列表中删除连续重复(整数和/或浮点数)