Замените одно совпадение регулярных выражений другим и наоборот

#r #string #replace

#r #строка #заменить

Вопрос:

Мне нужно заменить в строке 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 ?

Ответ №1:

Использование str_replace_all нескольких замен и перемещение первого совпадения во временное значение.

 library(stringr)

str_replace_all(my_str, c("foo" = "tmp", "bar" = "foo", "tmp" = "bar"))

[1] "bar foo bar foo foo bar"
 

Ответ №2:

Нет реальной причины для этого, если вы не можете установить дополнительные пакеты, но просто для развлечения вот базовое решение R (следуя методу замены «tmp» в ответе @manotheshark):

 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"
 

Ответ №3:

Вариант 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"