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

Remove everything except period and numbers from string regex in R

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

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"

谢谢。

试试这个

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

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

b 的元素是 R 表达式,所以遍历每个元素,解析它,然后创建你想要的字符串。

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

如果我没理解错的话,这就是你想要的:

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

或者如果您希望所有 "numbers" 作为数字向量:

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

这是 stringrstr_extract_all 的另一个选项。使用 str_extract_all 将数字部分提取到 list,转换为 numericrbind list 元素和 cbind 它的第一列'df'

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