【问题标题】:tidyverse/stringr how to find and replace on exact matchestidyverse/stringr 如何查找和替换完全匹配
【发布时间】:2021-09-09 06:26:19
【问题描述】:

我正在尝试执行查找和替换功能。先前的调查表明 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

提前致谢。

【问题讨论】:

    标签: r tidyverse stringr


    【解决方案1】:

    指定 ^$ 来建议字符串的开头和结尾,以便它只匹配 '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"
    

    【讨论】:

    • 谢谢,^ 和 $ 的使用在示例中效果很好,但不能转化为野生数据集。我必须解决一些其他问题。最后一个解决方案在 reprex 中有效,但野生数据集还有许多其他行。我应该构建一个使这个事实更清楚的代表;现在编辑问题。
    • @ncraig 列中可能有一些前导/滞后空间。通过df$col1 &lt;- trimws(df$col1) 尝试并应用代码。
    【解决方案2】:

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

    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'
    

    【讨论】:

      【解决方案3】:

      也许您需要负前瞻。让我向您展示一个修改后的示例-

      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 年 6 月 26 日创建

      【讨论】:

        猜你喜欢
        • 2012-12-06
        • 1970-01-01
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多