Как заменить только один символ в регулярном выражении с помощью str_replace - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь стандартизировать некоторые нечетные строковые данные, используя регулярные выражения и str_replace_all. В некоторых случаях я хочу использовать наборы символов (например, [abc]) или «символы подстановки» (например, \d), чтобы найти заменяемый символ, но я не хочу заменять эти наборы символов или символы подстановки.

Ниже data - это тип данных, которые у меня есть, а clean - это то, что я пытаюсь получить:

data <- c("1ac 2b", "1 a", "1a b", "1a2b", "0")
clean <- c("1ac 2b", "1a", "1ab", "1a 2b", "0")

Я пытался создать такие команды, как следующие:

attempt1 <- str_replace_all(data, "[abc]\\d", "[abc] \\d")
attempt2 <- str_replace_all(data, " [abc]", "[abc])

В обеих этих попытках я теряю нужные данные.

Кажется, что второй аргумент str_replace_all принимает регулярные выражения, но третий аргумент вычисляется буквально, поэтому я заканчиваю тем, что заменяю символы, которые не хочу заменять.

Есть ли способ передать значение группового символа и наборов символов из части команды регулярного выражения в компонент замены? В качестве альтернативы, есть ли другой способ решения этой проблемы, который кто-то порекомендует?

В сторону: я новичок в регулярных выражениях, и если кто-нибудь даст мне лучший термин, чем "подстановочные знаки", я соответствующим образом отредактирую свой пост.

Ответы [ 2 ]

2 голосов
/ 31 марта 2019

Вы должны захватить символы, которые хотите оставить с (), а затем использовать \\1 и \\2 для каждой группы.

Ваш replace и регулярные выражения должны быть:

data <- c("1ac 2b", "1 a", "1a b", "1a2b", "0")

attempt1 <- str_replace_all(data, "([abc])(\\d)", "\\1 \\2")
attempt2 <- str_replace_all(attempt1, " ([abc])", "\\1")

> attempt2
[1] "1ac 2b" "1a"     "1ab"    "1a 2b"  "0" 

Вторая замена принимает attempt1 в качестве ввода для применения обоих правил замены. Вы можете написать оба выражения в одну строку, если хотите.

str_replace_all(str_replace_all(data, "([abc])(\\d)", "\\1 \\2"), " ([abc])", "\\1")
0 голосов
/ 31 марта 2019

Или в базе R используйте gsub. Стратегия: Удалите все пробелы, затем добавьте пробелы перед цифрами, которые не являются границами слов. Это должно быть более общим.

gsub("(\\B\\d)", " \\1", gsub("\\s", "", x))
# [1] "1ac 2b" "1a"     "1ab"    "1a 2b"  "0" 

Или в функции.

mySub <- function (x) {
  x <- gsub("\\s", "", x)
  gsub("(\\B\\d)", " \\1", x)
}
mySub(x)
# [1] "1ac 2b" "1a"     "1ab"    "1a 2b"  "0" 

Данные

x <- c("1ac 2b", "1 a", "1a b", "1a2b", "0")
...