我有文字数据(讲故事),我的目的是提取由共现模式定义的某些单词,即它们出现在重叠之前,并用方括号表示。数据是这样的:
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'
这是为什么?以及如何提取精确匹配?
答案 0 :(得分:3)
在您的代码中,您可以将perl=TRUE
添加到gregexpr。
在您的模式\w.*
中,将匹配一个单词char,然后匹配0次以上的任何char。
这部分\[[^]].*]
将匹配[
,然后是1个非]
的字符,然后是.*
,它将匹配0+次以上的任何字符,后跟{{1} }。
您可以将模式更新为重复单词char和字符类本身。
]
说明
\w+(?=\s\[[^]]*])
匹配1个以上的字符字符\w+
正向前进,断言直接在右边的是
(?=
匹配单个空格字符\s
使用negated character class匹配从打开\[[^]]*]
到关闭[
]
积极回望使用双反斜杠:
)
作为替代方案,您可以使用捕获组,而不使用先行
\\w+(?=\\s\\[[^]]*])