我从事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"