r-如何将字符串中的所有实数(甚至是负数和科学数字)提取到数字向量中

  • 本文关键字:数字 向量 提取 字符串 实数 r regex
  • 更新时间 :
  • 英文 :


我从事R编程语言的工作,希望您能帮助我制定正则表达式。

我有一个设置,我接受来自用户的数字列表作为字符串,我想将字符串中的所有数字提取到数字向量中。我已通知用户向我提供用逗号分隔的数字。但我不能指望用户尊重这一点。因此,我想提取数字,即使它们用空格、分号或其他奇怪的东西分隔。

我希望能够从字符串中提取所有实数,即使这些数字是负数(例如-5(或包含小数(例如5.5(或是科学记数法(例如5.5e-5、5.5e-5、5.5e+5、5.5e5、5.5e5(

我在一个论坛上读到了一个类似的问题,并确定了可以从字符串中提取数字的正则表达式,但我意识到它不适用于负数、小数或科学记数法。我希望能够处理所有的事情。

Using this regular expression I am able to extract real whole numbers from a string separated by spaces or commas or even semi-colons. 
# Using this string works 
this_string = "1, 2  3, 5, 7, 10, 11, 12; 18" 
extracted_numbers = as.numeric(regmatches(this_string, gregexpr("[0-9]+", this_string))[[1]])
print(extracted_numbers)

提取结果:[1]1 2 3 5 7 10 11 12 18

但是,同样的正则表达式不适用于这个更复杂的负数、科学记数法和小数字符串。

this_string = "-1, 0, 5e-1 ; 7E-1, 2  3.0, 4, 5.33e+2"

提取结果:[1]1 0 5 1 7 1 2 3 0 4 5 33 2

从字符串中正确提取数字应该会产生:

所需提取结果:[1]-1.0 0.0 0.5 0.7 2.0 4.0 533.0

非常感谢你的帮助。

编辑:我刚刚找到了一个可行的解决方案:

this_string = "-1, 0, 5e-1 ; 7E-1, 2  3.0, 4, 5.33e+2" 
extracted_numbers = as.numeric(regmatches(this_string, gregexpr("[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?", this_string))[[1]])
print(extracted_numbers)

用户Wojciech Sobala用上面的正则表达式回答了这个问题:从字符串中提取十进制数

谢谢沃伊切赫。

这就是您需要的吗?

library(tidyverse)
data.frame(this_string) %>%
mutate(
# split strings and convert to numeric:
this_string = lapply(
# split strings:
str_split(this_string, ",\s|\s;\s|\s+"),
# apply `as.numeric`:
as.numeric)
)
this_string
1 -1.0, 0.0, 0.5, 0.7, 2.0, 3.0, 4.0, 533.0

如果您喜欢将结果作为向量:

lapply(str_split(this_string, "",\s|\s;\s|\s+"), as.numeric)

或者,您可以使用str_extract_all:来提取数字本身,而不是按数字之间的值来分割字符串

lapply(str_extract_all(this_string,"-?\d*\.?\d+([eE][+-]?\d+)?"), as.numeric)

编辑

这里有一个更简单的方法,本质上依赖于负字符类\S,它匹配\s字符类中而非的任何字符(主要是空白(:

lapply(str_extract_all(this_string,"(?!;)\S+(?=,|$)"), as.numeric)

数据:

this_string = "-1, 0, 5e-1 ; 7E-1, 2  3.0, 4, 5.33e+2"

相关内容

  • 没有找到相关文章

最新更新