используя str_replace_all для замены / на \ - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю через R для Data Science, и одно из упражнений просит меня заменить все прямые косые черты на обратную.Я не могу заставить это работать.

> x <- c("//w+", "//b[aeiou]//b")
> str_replace_all(x, "/", "\\")
[1] "w+"        "b[aeiou]b"

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

> x <- c("//w+", "//b[aeiou]//b")
> str_replace_all(x, "/", "\\\\")
[1] "\\\\w+"            "\\\\b[aeiou]\\\\b"

Редактировать: I 'Я добавляю это, чтобы уточнить мой вопрос.Я буквально хочу, чтобы строка "//" была "\\".Я не могу этого добиться.Вот пример в действии, показывающий, как это не работает.

Это работает, потому что я правильно использовал \ \ в строке:

> x <- "\\w+'\\w+"
> sentence <- "Open the crate but don't break the glass."
> str_extract(sentence, x)
[1] "don't"

Это не работает.Я по ошибке использовал / вместо \ и пытаюсь использовать str_replace_all, чтобы исправить это:

> y <- "//w+'//w+"
> z <- str_replace_all(y, "/", "\\\\")
> str_extract(sentence, z)
[1] NA

Это потому, что z - это не "\\ w + '\\ w +", как я хочу, а скорее:

> z
[1] "\\\\w+'\\\\w+"

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

str_replace_all(x, "/", "\\\\") и str_replace_all(x, "/", "\\") оба работают в r для этой проблемы

0 голосов
/ 05 декабря 2018

Решение, данное онлайн, на самом деле работает правильно!Дополнительные обратные слэши, которые вы видите, - это escape-символы , необходимые для других функций, чтобы правильно интерпретировать наличие \ символов.

Следующие команды:

x <- c("//w+", "//b[aeiou]//b")
y <- str_replace_all(x, "/", "\\\\")

Создать новый вектор y.При выводе на консоль R вы увидите следующее:

[1] "\\\\w+"            "\\\\b[aeiou]\\\\b"

Это выглядит неправильно, но это не так.Опять же, дополнительные обратные слэши существуют для того, чтобы избежать буквальных слешей.Если вы передадите эти строки в функцию, которая интерпретирует строки , вы увидите, что строковое представление действительно корректно, каждая прямая косая черта заменена обратной косой чертой:

message(y)
\\w+\\b[aeiou]\\b

cat(y)
\\w+ \\b[aeiou]\\b
...