首页 > 解决方案 > 在R中使用环视从字符串中提取匹配项

问题描述

我有文本数据(讲故事),我的目标是提取由共现模式定义的某些单词,即它们紧接在重叠之前出现,用方括号表示。数据是这样的:

who <- c("Sue:", NA, "Carl:", "Sue:", NA, NA, NA, "Carl:", "Sue:","Carl:", "Sue:","Carl:")
story <- c("That’s like your grand:ma. did that with::=erm          ",
       "with Ju:ne (.) once or [ twice.]                        ",
       "                       [ Yeah. ]                        ",
       "And June wanted to go out and yo- your granny said (0.8)",
       "“make sure you're ba(hh)ck before midni(hh)ght.”        ",
       "[Mm.]                                                   ",
       "[There] she was (.) a ma(h)rried woman with a(h)-       ",
       "She’s a right wally.                                    ",
       "mm [kids  as well ]                                     ",
       "   [They    assume] an awful lot man¿                   ",
       "°°ye:ah,°°                                              ",
      "°°the elderly do.°°                                      ")
CAt <- data.frame(who, story)

现在,定义模式:

pattern <- "\\w.*\\s\\[[^]].*]"

并使用 grep():

grep(pattern, CAt$story, value = T)
[1] "with Ju:ne (.) once or [ twice.]                        "
[2] "mm [kids  as well ]                                     "

我得到了包含目标匹配的两个字符串,但我真正追求的只是目标词,在这种情况下是“或”和“毫米”。对我来说,这似乎需要积极的展望。所以我重新定义了模式:

pattern <- "\\w.*(?=\\s\\[[^]].*])"

它说的是:“如果您看到一个空格后跟方括号,并且该单词右侧有一些内容,则匹配该单词”。现在只提取完全匹配,我通常使用这段代码,只要不涉及环视,它就可以正常工作,但这里会引发错误:

unlist(regmatches(CAt$story, gregexpr(pattern, CAt$story)))
Error in gregexpr(pattern, CAt$story) : 
invalid regular expression, reason 'Invalid regexp'

为什么是这样?以及如何提取精确匹配?

标签: rregexregex-lookarounds

解决方案


在您的代码中,您可以添加perl=TRUE到 gregexpr。

在您的模式\w.*中,将匹配单个单词 char,然后匹配任何 char 0+ 次。

这部分\[[^]].*]将匹配[,然后是 1 个不匹配的字符],然后 .*匹配任何字符 0+ 次,然后是].

您可以将模式更新为重复单词 char 和字符类本身。

\w+(?=\s\[[^]]*])

解释

  • \w+匹配 1+ 个单词字符
  • (?=积极的前瞻,断言直接在右边的是
    • \s匹配单个空格字符
    • \[[^]]*]使用否定字符类[从开始到结束匹配]
  • )关闭正向前瞻

正则表达式演示

使用双反斜杠:

\\w+(?=\\s\\[[^]]*])

作为替代方案,您可以使用捕获组而不是使用前瞻

(\w+)\s\[[^]]*]

正则表达式演示


推荐阅读