【问题标题】:regex: get text between two words (in R)正则表达式:获取两个单词之间的文本(在 R 中)
【发布时间】:2017-01-19 23:54:31
【问题描述】:

我有一个文本文档,我正在尝试获取“抽象”和“关键字”之间的文本(在 R 中)。这是我正在使用的代码:

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

但是,这不起作用,因为在文本的其他地方出现了“抽象”这个词,所以我让它像这样不贪心(在摘要前面添加 ?)

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

但由于某种原因,它现在采用“抽象”和“关键字”之间的文本(这是我想要的),但也从文本中出现的第二个“抽象”开始,一直到最后. 有什么想法吗?

【问题讨论】:

标签: r regex


【解决方案1】:

我认为这应该可以满足您的需求:

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

它的作用:

  • (?&lt;=abstract) 使用“前瞻”功能查找“抽象”一词之后的内容
  • .* 匹配任意数量的关键字
  • (?=keywords) 使用“look behind”来查找“关键字”之前的内容
  • 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"
    

    【讨论】:

    • 您好,感谢您的快速回答!老实说,我不擅长正则表达式,我只是通过在谷歌上搜索找到了该命令。还有一个问题,我使用完全相同的命令来获取“抽象”和“介绍”之间的文本,并且由于某种原因确实有效。你知道为什么吗?下面是代码:gsub(".*abstract\\s*|introduction.*", "", words)
    • 首先是我最喜欢的备忘单:cheatography.com/davechild/cheat-sheets/regular-expressions(我经常使用那个东西,因为正则表达式很难)
    • 是的,我知道,但我的问题是为什么我发布的那段代码有效(信不信由你,但它确实适用于介绍部分而不是关键字部分,这就是为什么我我很困惑)。再次感谢!
    • 哦,我明白了,如果没有看到您正在使用的实际文本,我无法确定地告诉您,可能发生的事情是用空字符串替换您的两个搜索词(\\1 真的"",因为什么都没有被抓到),剩下的就是你的目标,但就像你后来看到的那样,这种策略并不总是能让你在“边界”之间找到文字
    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    相关资源
    最近更新 更多