从带有R中环顾四周的字符串中提取匹配项

时间:2019-07-14 09:45:13

标签: r regex regex-lookarounds

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

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 ]                                     "

我得到了目标匹配的两个字符串 ,但是我真正追求的只是目标词,在这种情况下是“ or”和“ mm”。在我看来,这似乎需要积极向前。所以我这样重新定义了模式:

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

大致说:“如果您看到一个空格,然后在方括号后加上一个包含该内容的内容,则匹配该单词”。现在,仅提取精确匹配项,我通常使用以下代码,只要不涉及环顾四周,该代码就可以正常工作,但是这里会引发错误:

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

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

1 个答案:

答案 0 :(得分:3)

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

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

这部分\[[^]].*]将匹配[,然后是1个非]的字符,然后是.*,它将匹配0+次以上的任何字符,后跟{{1} }。

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

]

说明

  • \w+(?=\s\[[^]]*]) 匹配1个以上的字符字符
  • \w+正向前进,断言直接在右边的是
  • ]积极回望

Regex demo

使用双反斜杠:

)

作为替代方案,您可以使用捕获组,而不使用先行

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

Regex demo