как изменить порядок и заменить части строки в r?

#regex #r #gsub

#регулярное выражение #r #gsub

Вопрос:

Я пытаюсь перевести некоторую текстовую информацию в R-скрипты. Для этого мне нужно заменить и изменить порядок частей строк.

 example <- "varA is 1 and not varB is 1"
  

Это то, что я хочу в результате (часть R-скрипта):

 exampleTrans <- "varA == 1 amp; varB != 1"
  

Это то, что я могу сделать сейчас:

 exampleTrans <- gsub(" is "," == ", example)
exampleTrans <- gsub(" and ", " amp; ", exampleTrans)
print(exampleTrans)
[1] "varA == 1 amp; not varB == 1"
  

Первая часть строки — это именно то, что я хотел, так что теперь мне нужно только что-то изменить во второй части. «не varB == 1» необходимо изменить на «varB ! = 1».

У кого-нибудь есть идея о том, как это сделать? Возможно ли это вообще? Заранее большое спасибо!

Ответ №1:

Вот мое решение, использующее stringr :

 library(stringr)
str_replace_all(exampleTrans, "not (\w ) =", "\1 !")
[1] "varA == 1 amp; varB != 1"
  

Объяснение: замените шаблон not (word) = на (word) ! , где word — имя переменной без пробелов. Настройте его соответствующим образом, если у вас есть конкретные имена переменных, содержащие, например, цифры или символы подчеркивания.

Комментарии:

1. Спасибо за быстрый ответ!

Ответ №2:

Хорошо, вот мое решение :

  • Сначала вам нужно разделить строку на две части, используя str_split() . Это полезно для определения части строки, в которой у вас есть not .
  • затем вы заменяете is на == when not isn’t there и != when not is there .
  • Затем вы можете свернуть результат с amp; помощью .

Вот мой код :

 library("stringr")
example <- "varA is 1 and not varB is 1"
out  <- str_split(example, "and")[[1]] 
ifelse(grepl(pattern = "not", x = out), sub(pattern = "([[:alpha:]] ) is ([[:digit:]] )", replacement = "\1 != \2", x = out), 
    sub(pattern = "([[:alpha:]] ) is ([[:digit:]] )", replacement = "\1 == \2", x = out)
   )
paste(out, collapse = "amp;")
  

Надеюсь, это сработает!