我想使用stringr
包删除与字符串模式不匹配的所有字符。到目前为止,我已经能够使用"\\w+(?= (grape|satsuma))"
作为模式删除模式之前的那些,但在模式仍然不可能之后删除它们。
> str_remove_all("apples grape banana melon olive persimon grape apples satsuma papaya",
+ "\\w+(?= (grape|satsuma))")
[1] " grape banana melon olive grape satsuma papaya"
期望的结果是:
"grape grape satsuma"
(注意:我知道在这种情况下最简单的方法是仅提取“葡萄”和“satsuma”,但出于分析目的,我更喜欢这种方式)
已编辑提供整个问题
整个问题如下,给定一个d
数据框,其中包含一个带字符串的列,该函数应仅返回匹配的相同列:
> d
# A tibble: 2 x 2
string_column c2
<chr> <dbl>
1 apples grape banana satsuma 3
2 grape banana satsuma melon 4
使用@ d.r提供的答案:
> d %>%
+ mutate_at(vars(string_column), ~ gsub("(grape|satsuma| )(*SKIP)(*FAIL)|.", "", ., perl = TRUE))
# A tibble: 2 x 2
string_column c2
<chr> <dbl>
1 " grape satsuma" 3
2 "grape satsuma " 4
到目前为止,使用stringr
包提供的所有答案都无法返回string_column
这是dput
的{{1}}:
d
答案 0 :(得分:1)
您可能希望在链接线程中查看negative lookaheads和一些相关的正则表达式技术。
但是,由于我们提取的字词,我宁愿使用str_extract_all
,我也是这样做的:
str_extract_all("apples grape banana melon olive persimon grape apples satsuma papaya",
"grape|satsuma")
"grape" "grape" "satsuma"
我也非常喜欢@steveLangsford在评论中留下的这句话:
paste0(unlist(str_extract_all("apples grape banana melon olive persimon grape apples satsuma papaya", "grape|satsuma")), collapse=" ")
"grape grape satsuma"
根据我们的讨论/评论进一步了解:
string_column <- c("apples grape banana satsuma", "grape banana satsuma melon")
c2 <- c(3, 4)
d <- tibble(string_column,c2)
myfun <- function(x) {paste0(unlist(str_extract_all(x, "grape|satsuma")), collapse=" ") }
sapply(d$string_column, myfun)
"grape satsuma" "grape satsuma"