根据从gregexpr返回的字符位置提取文本

时间:2019-02-01 18:37:24

标签: r regex nlp tidytext

我正在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)

这提供了每个文档中最后一个“ Credit:”字符串的整数位置的列表,或找不到实例的值“ -1”。 (这些缺失的值构成了一个单独但相关的问题,我认为在解决此问题后我可以解决)。

我尝试了strsplit,substr,stri_match_last和rm_between的变体...但是无法找到一种方法来使用字符位置代替正则表达式来提取字符串的这一部分。

如何使用字符的位置来操纵字符串而不是正则表达式?有没有更好的方法(也许使用正则表达式)?

1 个答案:

答案 0 :(得分:2)

这样吧:

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"

正则表达式模式正在寻找Credit,但是因为它以.*开头,所以它将查找单词的最后一个实例(如果您想要 first 实例的Credit中,您将使用.*?)。 \\s*与贷项之后和文本其余部分之前的0个或多个空格字符匹配。然后,我们捕获document中每个(.*)的其余部分,作为捕获组1。然后返回\\1。另外,我使用ignore.case = TRUE,因此creditCREDITCredit将全部匹配。

与您的对象对应的是:

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