Как извлечь текст, который был добавлен в строку в R - PullRequest
0 голосов
/ 03 июля 2018

У меня есть строка с известным форматом, что-то вроде:

"This string will have additional text here *, and it will have more here ^, and finally there will be more here ~ with some text after."

и часть данных будет

"This string will have additional text here about things, and it will have more here regarding other stuff, and finally there will be more here near the end with some text after."

, где вставленный текст не всегда будет одинаковой длины. Мне нужен способ определить, чему каждый из *, ^, ~ равен во второй строке:

* = "about things"
^ = "regarding other stuff"
~ = "near the end"

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

Я пытался осмотреться, но не могу найти ничего похожего на то, что я прошу, даже начать, любой пакет или функция были бы действительно полезны!

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Просто небольшое изменение @ ответа Бенджамина Шлегеля с использованием пакета stringr , который удерживает известные детали и их замены (визуально) ближе друг к другу.

library(stringr)

text <- "This string will have additional text here about things, and it will have more here regarding other stuff, and finally there will be more here near the end with some text after."

text_repl <-
  str_replace_all(
    text,
    c(
      "This string will have additional text here " = "",
      ", and it will have more here "               = "^",
      ", and finally there will be more here "      = "^",
      " with some text after."                      = ""
    )
  )

str_split(text_repl, "\\^", simplify = TRUE)
#>      [,1]           [,2]                    [,3]          
#> [1,] "about things" "regarding other stuff" "near the end"

str_split() возвращает либо список векторов символов (simplify = FALSE), либо матрицу символов (simplify = TRUE), которую можно легко преобразовать в data.frame.

0 голосов
/ 03 июля 2018

Возможно, вы можете посмотреть на уникальные шаблоны слов до и после ~, * и ^ и т. Д. И поместить их в вектор, подобный этому:

priorstrings <- c("text here", "have more here", "be more here")
afterstrings <- c("and it", "and finally", "with some")  

Затем проверьте, действительно ли они уникальны, проверив,

length(unique(priorstrings)) == length(priorstrings)
length(unique(afterstrings)) == length(afterstrings)

оба имеют значение ИСТИНА.

Затем вставьте их вместе, посмотрев между ними, вот так:

fullsearches <- paste0(priorstrings, " (.*? )" , afterstrings)

Я снова использовал ваш пример строки, назвал ее y и добавил еще одну с именем z:

y <- "This string will have additional text here about things, and it will have more here regarding other stuff, and finally there will be more here near the end with some text after."
z <- "This string will have additional text here on this topic, and it will have more here to follow up, and finally there will be more here to finish with some text after."

Затем, наконец, сделайте что-то вроде этого:

sapply(list(y,z), function(x) str_match(x, fullsearches)[,2])

Это дает:

     [,1]                      [,2]             
[1,] "about things, "          "on this topic, "
[2,] "regarding other stuff, " "to follow up, " 
[3,] "near the end "           "to finish "  

Я думаю, что вы можете полностью добавить больше предшествующих строк, последующих строк и полных поисков таким образом, а также применить это к большим спискам строк.

0 голосов
/ 03 июля 2018

Сейчас нет, если это лучшее решение, но я бы заменил известные части разделителем (или ничего в начале и и), а затем разделил бы полученный текст этим разделителем.

text = "This string will have additional text here about things, and it will have more here regarding other stuff, and finally there will be more here near the end with some text after."
temp = gsub("This string will have additional text here ", "", text)
temp = gsub(", and it will have more here ", "^", temp)
temp = gsub(", and finally there will be more here ", "^", temp)
temp = gsub(" with some text after.", "", temp)
solution = unlist(strsplit(temp, "\\^"))
solution
...