在我的成绩单中,静音暂停用圆括号表示,例如(0.9)但是(。)用于暂停< 0.3秒我想提取这些停顿。但是,抄写员的评论也是相似的,即双圆括号,例如: ((咳嗽))。对于这个例子
yy <- c("well [yes right] (.)", "let's go ((giggles))", "oh [ we::ll] i do n't (0.5) know", "erm [°well right° ]", "(3.2)")
这提取了所有的暂停,但也提取了抄录评论:
pattern <- "(\\(.*?\\))"
grep(pattern, yy, value=T)
matches <- gregexpr(pattern, yy)
paus <- regmatches(yy, matches)
paus <- unlist(paus)
paus
[1] "(.)" "((giggles)" "(0.5)" "(3.2)"
为了摆脱评论,我尝试了这个:
pattern <- "\\([^\\(].*?\\)[^\\)].*?"
发现“(0.5)”但未能找到字符串最终暂停“(。)”和“(3.2)”。 任何指针?
答案 0 :(得分:3)
gsub
的另一个选项:
gsub("[^(]*(\\(([.0-9]+)\\)|\\b|\\B)[^)]*", "\\2", yy)
#[1] "." "" "0.5" "" "3.2"
模式说明:
。 [^(]*
:除开放式括号外的任何内容,0次或更多次
。 (\\(([.0-9]+)\\)|\\b|\\B)
:我们想要捕获的内容:一个开放的括号后跟一个或多个数字,一次或多次,后跟一个右括号(我们只想捕获点或数字部分,因此\\2
在替换部分中)或空字符串可以位于单词的边缘(\\b
)或不是(\\B
)。 N.B:我们不会在暂停时间内保留括号,但我们可以。
。 [^)]*
:除结束括号外的任何内容,0次或更多次
答案 1 :(得分:2)
我们可以使用str_extract
提取模式,该模式表示可选数字后跟小数,然后是另一个可选数字值。我们在这里使用可选(“?”)来获取空值“(。)”。
library(stringr)
vec <- str_extract(yy, "(\\((\\d+)?(\\.(\\d)?\\)))")
vec
#[1] "(.)" NA "(0.5)" NA "(3.2)"
然后使用is.na
删除NA
元素
vec[!is.na(vec)]
#[1] "(.)" "(0.5)" "(3.2)"
或者使用与基础R regmatches
相同的正则表达式,可以保存删除NA
值的步骤。
regmatches(yy, regexpr("(\\((\\d+)?(\\.(\\d)?\\)))", yy))
#[1] "(.)" "(0.5)" "(3.2)"