Как я могу извлечь и удалить строку?Таким образом, у меня могут быть похожие выражения совпадать 1 раз, а не несколько раз - PullRequest
0 голосов
/ 03 февраля 2019

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

Вопрос:

Как я могу убедиться, что после извлечения шаблона любой текст, который ему соответствует, удаляется из строки?

Что я получу:

str_extract("Mr Bean and friends", pattern = fixed(c("Mr Bean", "Bean", "Mr")))  
[1] "Mr Bean" "Bean"    "Mr"     

Что я хочу: (я знаю, что не могу добиться этого только с помощью str_extract ()или одна строка кода)

str_extract("Mr Bean and friends", pattern = fixed (c("Mr Bean", "Bean", "Mr")))  
[1] "Mr Bean" NA NA    

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Будет ли работать pmatch работать?

my_string <- "Mr Bean and friends"
my_pattern <- c("Mr Bean", "Bean", "Mr")

out <- my_pattern[pmatch(my_pattern,my_string)]
out
[1] "Mr Bean" NA        NA
0 голосов
/ 03 февраля 2019

Один из вариантов - рекурсивное обновление.Поскольку мы хотим, чтобы выходные данные vector из length 'n' равнялись length из pattern vector, создайте выходной вектор для хранения значений, а затем обновите исходную строку после выполнения каждого «шаблона»удалив 'pattern' из строки и обновив его

library(stringr)
for(i in seq_along(pat))  {
      out[i] <- str_extract(str1, pattern = fixed(pat[i]))
      str1 <- str_remove(str1, pat[i])
 }
out
#[1] "Mr Bean" NA        NA   

или тем же методом с vapply и обновив исходную строку с помощью <<-

unname(vapply(pat, function(p) {
   out <- str_extract(str1, p)
   str1 <<- str_remove(str1, p)
   out}, character(1)))
#[1] "Mr Bean" NA        NA       

данные

# initialize an output vector
out <- character(length(pat))
# pattern vector
pat <- c("Mr Bean", "Bean", "Mr")
# initial string
str1 <- "Mr Bean and friends"
str2 <- str1
...