使用R

时间:2018-05-22 09:58:16

标签: r regex

在我的成绩单中,静音暂停用圆括号表示,例如(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)”。 任何指针?

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