问题描述
我需要将字符串 foo bar foo bar bar foo
中的所有 foo
替换为 bar
,并将所有 bar
替换为 foo
。所以结果应该看起来像 bar foo bar foo foo bar
。
我试过这种方式:
library(stringr)
my_str <- "foo bar foo bar bar foo"
rslt <- str_replace_all(my_str,c("foo","bar"),c("bar","foo"))
print(rslt)
但我得到了 "bar bar bar bar bar bar" "foo foo foo foo foo foo"
。
问题:如何更正我的代码以获得 bar foo bar foo foo bar
?
解决方法
使用 str_replace_all
多个替换并将第一个匹配项移动到临时值。
library(stringr)
str_replace_all(my_str,c("foo" = "tmp","bar" = "foo","tmp" = "bar"))
[1] "bar foo bar foo foo bar"
,
除非您无法安装额外的软件包,否则没有真正的理由这样做,但只是为了好玩,这里有一个基本的 R 解决方案(遵循@manotheshark 回答中的“tmp”替换方法):
Reduce(
function(prev,x) gsub(x[1],x[2],prev),list(c('foo','tmp'),c('bar','foo'),c('tmp','bar')),my_str)
# [1] "bar foo bar foo foo bar"
,
一个选项是split
并替换
str_c(setNames(v1,rpl)[str_split(my_str,"\\s+")[[1]]],collapse = ' ')
#[1] "bar foo bar foo foo bar"
或者另一个选项是gsubfn
library(gsubfn)
gsubfn("(\\w+)",setNames(as.list(v1),rpl),my_str)
#[1] "bar foo bar foo foo bar"