Извлечение текста на основе позиции символа, возвращенной из gregexpr - PullRequest
0 голосов
/ 01 февраля 2019

Я работаю в R, пытаюсь подготовить текстовые документы для анализа.Каждый документ хранится в столбце (метко названном «документ») фрейма данных, который называется «metaDataFrame».Документы представляют собой строки, содержащие статьи и информацию о цитировании BibTex.Фрейм данных выглядит следующим образом:

[1] filename         document                          doc_number
[2] lithuania2016    Commentary highlights Estonian...    1
[3] lithuania2016    Norwegian police, immigration ...    2
[4] lithuania2016    Portugal to deply over 1,000 m...    3

Я хочу извлечь информацию BibTex из каждого документа в новый столбец.Информация о цитировании начинается с «Credit:», но некоторые статьи содержат несколько экземпляров «Credit:», поэтому мне нужно извлечь весь текст после последнего экземпляра.К сожалению, строке только иногда предшествует новая строка.

Мое решение до сих пор заключалось в том, чтобы найти все экземпляры строки и сохранить местоположение последнего экземпляра «Credit:» в каждом документе в списке:

locate.last.credit <- lapply(gregexpr('Credit:', metaDataFrame$document), tail, 1)

Это обеспечивает список целочисленных местоположений последней строки «Кредит:» в каждом документе или значения «-1», где экземпляр не найден.(Эти пропущенные значения представляют собой отдельную, но связанную проблему, которую, я думаю, я могу решить после решения этой проблемы).

Я пробовал варианты strsplit, substr, stri_match_last и rm_between ..., но не могу найти способ использовать положение символа вместо регулярного выражения для извлечения этой части строки.

Как я могу использовать расположение символов для манипулирования строкой вместо регулярных выражений?Есть ли лучший подход к этому (возможно, с регулярным выражением)?

1 Ответ

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

Примерно так:

test_string <- " Portugal to deply over 1,000 m Credit: mike jones Credit: this is the bibliography"

gsub(".*Credit:\\s*(.*)", "\\1", test_string, ignore.case = TRUE)

[1] "this is the bibliography"

Шаблон Regex ищет Credit, но поскольку ему предшествует .*, он найдет последний экземпляр слова (если вы хотите первый экземпляр Credit, вы бы использовали .*?).\\s* соответствует 0 или более пробелам после кредита и до остальной части текста.Затем мы фиксируем остаток каждого document в (.*) как группу захвата 1. И мы возвращаем \\1.Кроме того, я использую ignore.case = TRUE, поэтому credit, CREDIT и Credit будут сопоставлены.

И с вашим объектом это будет:

gsub(".*Credit:\\s*(.*)", "\\1", metaDataFrame$document, ignore.case = TRUE)
...