tidyverse/stringr 如何查找和替换完全匹配
tidyverse/stringr how to find and replace on exact matches
我正在尝试执行查找和替换功能。之前的调查表明这应该可以用 stringr::str_replace
和 stringr::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 创建
我正在尝试执行查找和替换功能。之前的调查表明这应该可以用 stringr::str_replace
和 stringr::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 创建