#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
на==
whennot
isn’t there и!=
whennot
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;")
Надеюсь, это сработает!