Строка заменяется на регулярное выражение - PullRequest
0 голосов
/ 24 января 2019

У меня есть шаблон, который я хочу сопоставить и заменить на X. Однако я хочу, чтобы шаблон был заменен только в том случае, если предыдущий символ представляет собой A, B или перед ним не стоит какой-либо символ (начало строки).

Я знаю, как заменить шаблоны с помощью функции str_replace_all, но я не знаю, как я могу добавить это дополнительное условие. Я использую следующий код:

library(stringr)

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("XXXX")



replacement <- str_replace_all(string, pattern, paste0("XXXX"))

Результат:

[1] "XXXXAXXXXBXXXXCXXXXDXXXXEXXXXAXXXX"

Желаемый результат:

Замена только в том случае, если предшествующим фрахтователем является A, B или нет символа:

[1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Не могли бы вы попробовать следующее.Используя метод положительного прогнозирования здесь.

string <- "0000A0000B0000C0000D0000E0000A0000"
gsub(x = string, pattern = "(^|A|B)(?=0000)((?i)0000?)",
    replacement = "\\1xxxx", perl=TRUE)

Вывод будет следующим.

[1] "xxxxAxxxxBxxxxC0000D0000E0000Axxxx"
0 голосов
/ 24 января 2019

Спасибо Виктору Стрибьеву за ответ!Он также работает с пакетом stringr:

library(stringr)

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("0000")

replace <- str_replace_all(string, paste0("(^|[AB])",pattern), "\\1XXXX")
replace

[1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"
0 голосов
/ 24 января 2019

Вы можете использовать

gsub("(^|[AB])0000", "\\1XXXX", string)

См. Демоверсию regex

Детали

  • (^|[AB]) - Группа захвата 1 (\1): начало строки (^) или (|) A или B ([AB])
  • 0000 - четыре нуля.

R демо :

string <- "0000A0000B0000C0000D0000E0000A0000"
pattern <- c("XXXX")
gsub("(^|[AB])0000", "\\1XXXX", string)
## -> [1] "XXXXAXXXXBXXXXC0000D0000E0000AXXXX"
...