r - 在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'
为什么是这样?以及如何提取精确匹配?
解决方案
在您的代码中,您可以添加perl=TRUE
到 gregexpr。
在您的模式\w.*
中,将匹配单个单词 char,然后匹配任何 char 0+ 次。
这部分\[[^]].*]
将匹配[
,然后是 1 个不匹配的字符]
,然后 .*
匹配任何字符 0+ 次,然后是]
.
您可以将模式更新为重复单词 char 和字符类本身。
\w+(?=\s\[[^]]*])
解释
\w+
匹配 1+ 个单词字符(?=
积极的前瞻,断言直接在右边的是\s
匹配单个空格字符\[[^]]*]
使用否定字符类[
从开始到结束匹配]
)
关闭正向前瞻
使用双反斜杠:
\\w+(?=\\s\\[[^]]*])
作为替代方案,您可以使用捕获组而不是使用前瞻
(\w+)\s\[[^]]*]
推荐阅读
- javascript - 如何在 jsRender 中引用 json 对象属性?
- python - Pandas:访问列中字符串的不同方式
- excel - 如何仅从整个 Excel 工作簿中复制值而不打开它?
- javascript - 反应钩子不更新
- html - HTML 自定义框架
- javascript - 在 React Native 中显示/隐藏文本 onPress
- python - python数据结构查找跨越给定时间点的窗口
- php - 为什么我的 API 需要 2-3 秒来处理一个请求?
- go - 如何修复golang中的竞争条件?
- react-native - 如何使用 Xcode 12 Beta 4 构建 React-Native 项目?