从R中的字符串正则表达式中删除除句点和数字之外的所有内容

时间:2016-08-14 17:13:01

标签: regex r string stringr

我知道关于正则表达式的堆栈溢出有很多问题,但我无法通过我见过的可用帮助完成这一个简单的任务。这是我的数据:

a<-c("Los Angeles, CA","New York, NY", "San Jose, CA")
b<-c("c(34.0522, 118.2437)","c(40.7128, 74.0059)","c(37.3382, 121.8863)")

df<-data.frame(a,b)
df
                a                    b
1 Los Angeles, CA c(34.0522, 118.2437)
2    New York, NY  c(40.7128, 74.0059)
3    San Jose, CA c(37.3382, 121.8863)

我想删除除数字和句号之外的所有内容(即删除“c”,“)”和“(”。这是我到目前为止所尝试的内容:

str_replace(df$b,"[^0-9.]","" )
[1] "(34.0522, 118.2437)" "(40.7128, 74.0059)"  "(37.3382, 121.8863)"

str_replace(df$b,"[^\\d\\)]+","" )
[1] "34.0522, 118.2437)" "40.7128, 74.0059)"  "37.3382, 121.8863)"

不确定要尝试什么。我想最终得到以下结论:

 [1] "34.0522, 118.2437" "40.7128, 74.0059"  "37.3382, 121.8863"

感谢。

4 个答案:

答案 0 :(得分:5)

如果我理解正确,这就是你想要的:

df$b <- gsub("[^[:digit:]., ]", "", df$b)

或:

df$b <- strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")
> df
                a                 b
1 Los Angeles, CA 34.0522, 118.2437
2    New York, NY  40.7128, 74.0059
3    San Jose, CA 37.3382, 121.8863

或者如果您想将所有“数字”作为数字向量:

as.numeric(unlist(strsplit(gsub("[^[:digit:]. ]", "", df$b), " +")))
[1]  34.0522 118.2437  40.7128  74.0059  37.3382 121.8863

答案 1 :(得分:3)

试试这个

gsub("[\\c|\\(|\\)]", "",df$b)
#[1] "34.0522, 118.2437" "40.7128, 74.0059"  "37.3382, 121.8863"

答案 2 :(得分:2)

不是正则表达式解决方案,而是一个简单的解决方案。

b的元素是R表达式,因此遍历每个元素,解析它,然后创建所需的字符串。

vapply(
  b, 
  function(bi) 
  {
    toString(eval(parse(text = bi)))
  }, 
  character(1)
)

答案 3 :(得分:1)

以下是来自str_extract_all的{​​{1}}的另一个选项。使用stringr将数字部分提取到str_extract_all,将listnumeric rbind元素转换为list,将cbind元素提取到第一列&#39; DF&#39;

library(stringr)
cbind(df[1], do.call(rbind, 
      lapply(str_extract_all(df$b, "[0-9.]+"), as.numeric)))