tidyverse/stringr 如何查找和替换完全匹配

tidyverse/stringr how to find and replace on exact matches

我正在尝试执行查找和替换功能。之前的调查表明这应该可以用 stringr::str_replacestringr::str_replace_all。但是,我遇到了 运行 问题,因为较长字符串中的部分匹配会导致不需要的结果。我希望模式参数匹配整个字符串,而不仅仅是字符串的一部分;当它只是一部分时,我希望替换操作忽略该单元格。对于如何最好在 mutate 语句中完成精确匹配查找和替换操作的任何见解,我将不胜感激。

library(tidyverse)
df <- tribble(
  ~col1,
  "foo",
  "foo bar",
  "foo",
  "foo bar",
  "pizza"
)

然后进行查找和替换,我看到的一般是这样的:

df %>% 
  mutate(col1 = str_replace_all(col1, pattern = "foo", replacement = "foo bar"))

不幸的是,这会产生不需要的结果:

foo bar             
foo bar bar             
foo bar             
foo bar bar
pizza

我正在寻找:

foo bar             
foo bar         
foo bar             
foo bar
pizza

提前致谢。

指定 ^$ 以建议字符串的开头和结尾,以便它仅匹配 'foo' 是唯一单词的情况(请注意 str_replace 也可以正常工作,因为我们在这里进行一次替换)

library(dplyr)
library(stringr)
df %>% 
   mutate(col1 = str_replace_all(col1, 
            pattern = "^foo$", replacement = "foo bar"))

-输出

# A tibble: 4 x 1
  col1   
  <chr>  
1 foo bar
2 foo bar
3 foo bar
4 foo bar

基于例子,我们只需要

df$col1 <- "foo bar"

由于您进行的是精确匹配而不是使用正则表达式,因此您可以使用 == 进行直接比较。

library(dplyr)

df %>% mutate(col1 = replace(col1, col1 == 'foo', 'foo bar'))

#   col1   
#  <chr>  
#1 foo bar
#2 foo bar
#3 foo bar
#4 foo bar
#5 pizza  

你也可以 -

df$col1[df$col1 == 'foo'] <- 'foo bar'

也许你需要负前瞻。让我给你看一个修改过的例子-

library(tidyverse)
df <- tribble(
  ~col1,
  "foo pizza",
  "foo bar",
  "foo",
  "foo bar",
  "pizza"
)

df
#> # A tibble: 5 x 1
#>   col1     
#>   <chr>    
#> 1 foo pizza
#> 2 foo bar  
#> 3 foo      
#> 4 foo bar  
#> 5 pizza

df %>% mutate(col1 = str_replace(col1, 'foo(?!\sbar)', 'foo bar'))
#> # A tibble: 5 x 1
#>   col1         
#>   <chr>        
#> 1 foo bar pizza
#> 2 foo bar      
#> 3 foo bar      
#> 4 foo bar      
#> 5 pizza

reprex package (v2.0.0)

于 2021-06-26 创建