Применение регулярного выражения к строке в R

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. Вау, как оперативно, спасибо, пока мне все не очень понятно, может быть, со временем я к этому привыкну