r #regex
#r #регулярное выражение
Вопрос:
Я только начинаю знакомиться с языком R, ранее работал с python. Задача состоит в том, чтобы заменить последний символ каждого слова в строке на *.
Как это должно выглядеть: example text in string
, и результат работы: exampl* tex* i* strin*
Мой код:
library(tidyverse)
library(stringr)
string_example = readline("Enter our text:")
string_example = unlist(strsplit(string_example, ' '))
string_example
result = str_replace(string_example, pattern = "*b", replacement = "*")
result
Я получаю сообщение об ошибке:
> result = str_replace(string_example, pattern = "*b", replacement = "*")
Error in stri_replace_first_regex(string, pattern, fix_replacement(replacement), :
Syntax error in regex pattern. (U_REGEX_RULE_SYNTAX, context=``)
Помогите решить задачу
О, я заметил ошибку, шаблон должен быть .b
. вот как выполняется код, но в строке нет замены
Комментарии:
1.
str_replace_all("example text in string",". ","* ") %>% str_replace(".$","*")
Ответ №1:
Если вы имеете в виду слова, состоящие только из букв, вы можете использовать
string_example <- "example text in string"
library(stringr)
str_replace_all(string_example, "\p{L}\b", "*")
## => [1] "exampl* tex* i* strin*"
Смотрите демонстрацию R и демонстрацию регулярных выражений.
Подробные сведения:
p{L}
— класс категории (свойства) Юникода, соответствующий любой букве Юникодаb
— граница слова, в данном случае она гарантирует, что сразу справа нет другого символа слова. Совпадение не будет выполнено, если за буквой, совпадающей сp{L}
, сразу же следует буква, цифра или_
(все это символы слов). Если вы хотите ограничить это проверкой букв, заменитеb
на(?!p{L})
.
Обратите внимание, что обратные косые черты удваиваются, потому что в обычных строковых литералах обратные косые черты используются для формирования escape-последовательностей строк и, следовательно, нуждаются в экранировании, чтобы вводить буквальные обратные косые черты в строковые литералы.
Еще несколько вещей, которые следует учитывать
- Если вы не хотите изменять однобуквенные слова, добавьте границу, не состоящую из слов, в начале,
"\B\p{L}\b"
- Если вы хотите избежать совпадения букв, за которыми следует
-
еще одна буква (т.Е. Некоторые составные слова), вы можете добавить контрольную проверку :"\p{L}\b(?!-)"
.
Вы можете комбинировать обходные пути и (не) границы слов по мере необходимости.
Комментарии:
1. Вау, как оперативно, спасибо, пока мне все не очень понятно, может быть, со временем я к этому привыкну