与stringr反向匹配

问题描述 投票:1回答:1

我想使用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

这是dputd

d <- structure(list(string_column = c("apples grape banana satsuma", 
"grape banana satsuma melon"), c2 = c(3, 4)), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame"))
r regex stringr
1个回答
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"
© www.soinside.com 2019 - 2024. All rights reserved.