如何检索字符串中的所有数字并使用正则表达式将它们合并为一个数字?

时间:2016-09-26 08:51:17

标签: r regex

这应该很简单,但使用其他SO帖子的建议后的结果让我感到困惑。当然,我想避免使用For loop

可重复的示例

library(stringr)
input <- "<77Â 500 miles</dd>"
mynumbers <- str_extract_all(input, "[0-9]")

变量 mynumbers 是五个字符的列表:

> mynumbers
[[1]]
[1] "7" "7" "5" "0" "0"

但这就是我之后的事情:

> mynumbers
[1] 77500

This post建议使用paste(),我认为这应该在正确的sepcollapse参数下正常工作,但我必须缺少必要的东西。我也试过使用unlist()。这是我到目前为止所尝试的内容:

1 - 使用paste()

> paste(mynumbers)
[1] "c(\"7\", \"7\", \"5\", \"0\", \"0\")"

2 - 使用paste()

> paste(mynumbers, sep = " ")
[1] "c(\"7\", \"7\", \"5\", \"0\", \"0\")"

3 - 使用paste()

> paste (mynumbers, sep = " ", collapse = NULL)
[1] "c(\"7\", \"7\", \"5\", \"0\", \"0\")"

4 - 使用paste()

> paste (mynumbers, sep = "", collapse = NULL)
[1] "c(\"7\", \"7\", \"5\", \"0\", \"0\")"

5 - 使用unlist()

> as.numeric(unlist(mynumbers))
[1] 7 7 5 0 0

我希望你们中的一些人有一些建议。 我想这是一个使用正则表达式的优雅解决方案,但我也对R特有的粘贴/未列出问题非常感兴趣!谢谢!

修改

该问题被标记为this post可能重复。 建议的解决方案肯定会解决问题,我有点尴尬地承认,尽管已经多次尝试在SO上找到现有的解决方案,但我没有看到这个帖子。不过,我的帖子还包含了有关stringr::str_extract_allbase::paste功能的详细信息,因此这里提供的具体答案对我至少非常有用。

1 个答案:

答案 0 :(得分:6)

str_extract_all会返回list。我们需要转换为vector,然后转换为paste。要提取list元素,我们使用[[,因为只有一个元素,mynumbers[[1]]将获得vector。然后,执行paste/collapseas.numeric

as.numeric(paste(mynumbers[[1]],collapse=""))
#[1] 77500

我们还可以匹配一个或多个非数字(\\D+),将其替换为""中的gsub并转换为numeric

as.numeric(gsub("\\D+", "", input))
#[1] 77500