使用stringr进行反向匹配

3

我希望使用 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"

(注意:我知道在这种情况下最简单的方法是仅提取“grape”和“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
以下是 ddput
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"))

2
gsub("(grape|satsuma| )(*SKIP)(*FAIL)|.", "", "apples grape banana melon olive persimon grape apples satsuma papaya", perl = TRUE) - d.b
@d.b 是的!但我想使用 stringr 包,你有什么想法吗? - Tito Sanz
使用 str_remove_all"\\w+(?= (grape|satsuma))" 作为模式,删除在 grapesatsuma 之前的单词。我的期望结果是 str_remove_all 删除不匹配 papayasatsuma 的所有内容,因此在这种情况下期望的结果是:"grape grape satsuma"。如果目的不够清晰,请告知。 - Tito Sanz
1个回答

4
你可能需要查看负向先行断言和一些相关的正则表达式技巧。
然而,由于我们正在提取词语,我更倾向于使用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"

@TitoSanz 我明白了。让我在午餐时间再多做一些工作,看看能否增加一些相关内容。 - Hack-R
1
paste0(unlist(str_extract_all("apples grape banana melon olive persimon grape apples satsuma papaya", "grape|satsuma")), collapse=" ") - steveLangsford
@TitoSanz 请粘贴错误信息,也许可以采用不同的方法解决。同时,提供应用该代码的位置也是很好的。与此同时,我正在考虑另一种方法。 - Hack-R
我尝试在数据框的一列上应用操作,但返回了一个错误: “列string_column的长度必须为2(行数)或1,而不是4”。所使用的代码是: `string_column <- c("apples grape banana satsuma", "grape banana satsuma melon") c2 <- c(3, 4) d <- tibble(string_column,c2) d %>%
mutate_at(vars(string_column),
function(x) paste0(unlist(str_extract_all(x, pattern = "grape|satsuma")))) `
- Tito Sanz
@TitoSanz 的sapply函数可用;我刚刚进行了相关编辑。 - Hack-R
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接