在空格之前提取字符串文本

时间:2019-05-21 16:59:37

标签: r regex

我有一个要转换为数字的字符数据向量,它看起来像这样:

[231] "34.05" "35.05" "36.05" "37.05" "1.09 " "2.09 " "3.09 " "4.09 " "5.09 " "6.09 "
[241] "7.09 " "8.09 " "9.09 " "46.86" "1.9 y" "2.9 y" "3.9 y" "4.9 y" "5.9 y" "6.9 y"

有些条目非常好,例如“ 37.05”,但是有些错误地提取了它们,例如"4.9 y”。我只想提取每个条目的部分。

我拥有的是:

data = stringr::str_extract(data, "([^/]+)(?=:space:)")

但是我得到了一堆NA。我应该如何处理?

3 个答案:

答案 0 :(得分:2)

您要在字符串的开头获取浮点值,因此请使用

x <- c("33.72", "34.72", "35.72", "36.72", "37.72", "29.05", "30.05", "31.05", "32.05", "33.05",
       "34.05", "35.05", "36.05", "37.05", "1.09 ", "2.09 ", "3.09 ", "4.09 ", "5.09 ", "6.09 ",
       "7.09 ", "8.09 ", "9.09 ", "46.86", "1.9 y", "2.9 y", "3.9 y", "4.9 y", "5.9 y", "6.9 y")
as.double(sub("^(\\d+\\.\\d+).*", "\\1", x))

请参见R demo onlineregex demo

详细信息

  • ^-字符串的开头
  • (\\d+\\.\\d+)-捕获组1(在替换模式中称为\1):1个或多个数字,一个点,然后是1个以上的数字
  • .*-尽可能多的0个或更多字符。

注意:如果可以包含浮点数和整数,请使用as.double(sub("^(\\d+(?:\\.\\d+)?).*", "\\1", x))

请参见regex graph

enter image description here

答案 1 :(得分:1)

您可以删除所有不是数字或句点的内容。

as.double(gsub("[^0-9\\.]+", "", x))
# [1] 33.72 34.72 35.72 36.72 37.72 29.05 30.05 31.05 32.05 33.05 34.05 35.05 36.05 37.05
#[15]  1.09  2.09  3.09  4.09  5.09  6.09  7.09  8.09  9.09 46.86  1.90  2.90  3.90  4.90
#[29]  5.90  6.90

数据

x <- c("33.72", "34.72", "35.72", "36.72", "37.72", "29.05", "30.05", "31.05", "32.05", "33.05",
       "34.05", "35.05", "36.05", "37.05", "1.09 ", "2.09 ", "3.09 ", "4.09 ", "5.09 ", "6.09 ",
       "7.09 ", "8.09 ", "9.09 ", "46.86", "1.9 y", "2.9 y", "3.9 y", "4.9 y", "5.9 y", "6.9 y")

答案 2 :(得分:1)

使用阅读器包中的parse_number更容易

> library(readr)
> parse_number(x)
 [1] 33.72 34.72 35.72 36.72 37.72 29.05 30.05 31.05 32.05 33.05 34.05 35.05 36.05 37.05  1.09  2.09  3.09  4.09  5.09
[20]  6.09  7.09  8.09  9.09 46.86  1.90  2.90  3.90  4.90  5.90  6.90

您甚至可以将实际模式从"([^/]+)(?=:space:)"更改为"\\d+\\.\\d*"

stringr::str_extract(x, "\\d+\\.\\d*")