正则表达式:在R语言中提取两个单词之间的文本

5

我有一个文本文件,想在 R 中获取 "abstract" 和 "keywords" 之间的文本。以下是我使用的代码:

gsub(".*abstract\\s*|keywords.*", "\\1", string)

然而,这并没有奏效,因为在文本中其他地方出现了单词“abstract”,所以我将其改为非贪婪模式,如下(在“abstract”前面添加了?)。

gsub(".*?abstract\\s*|keywords.*", "\\1", string)

但出于某种原因,现在它获取了“摘要”和“关键词”之间的文本(这是我想要的),但同时也获取了从文本中第二个“摘要”开始的文本,一直到结束。 有什么建议吗?

2个回答

3
我认为这应该能给您提供您正在寻找的内容:

我认为这应该能够满足您的需求:

regmatches(string, gregexpr("(?<=abstract).*(?=keywords)", string, perl = TRUE))

这段代码的作用:

  • (?<=abstract) 使用“向前查找”的能力来查找单词“abstract”之后的内容
  • .* 匹配任意数量的关键字
  • (?=keywords) 使用“向后查找”查找单词“keywords”之前的内容
  • gregexprstring中查找给定的正则表达式
  • perl = TRUE 允许使用“向前查找”和“向后查找”功能。
  • regmatches 使用正则表达式提取字符串的匹配部分。

2

看起来你在搜索项中没有捕获任何内容,你只需要在那里添加一些 () 来实际获取一些东西,这样 \\1 就会返回你的目标:

words <- c("these are some different abstract words that might be between keywords or they might just be bounded by abstract ideas")
gsub(".* abstract (.*) keywords.*", "\\1", words)
[1] "words that might be between"

嘿,感谢您的快速回答!说实话,我不擅长正则表达式,我只是在Google上搜索到了这个命令。还有一个问题,我使用完全相同的命令来获取“摘要”和“介绍”之间的文本,但由于某种原因,那个命令不起作用。您知道为什么吗?这是代码:gsub(“.abstract\s|introduction.*”,“”,words) - user7443687
1
这是我的最爱备忘单:https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/(我经常使用它,因为正则表达式很难) - Nate
是的,我知道,但我的问题是为什么我发布的那段代码有效(信不信由你,但它实际上对介绍部分有效而对关键字部分无效,这就是我感到困惑的原因)。再次感谢! - user7443687
哦,我明白了。如果没有看到你实际处理的文本,我无法确定。很可能发生的情况是通过用空字符串替换两个搜索词(\\1实际上是"",因为没有被捕获),你只剩下了目标,但正如你后来看到的那样,这种策略并不总是能给你在“边界”之间的单词。 - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接