使用R中的正则表达式提取圆括号中的字符串

使用R中的正则表达式提取圆括号中的字符串,r,regex,R,Regex,在我的成绩单中,无声停顿用圆括号表示,例如,(0.9)但也用(.)表示

在我的成绩单中,无声停顿用圆括号表示,例如,(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)")

yy我们可以使用
str_extract
提取模式,该模式表示一个可选数字后跟一个小数,然后后跟另一个可选数字值。我们在这里使用可选(“?”)来获取空值“(.)”


或者将相同的正则表达式与base R
regmatches
一起使用,可以保存删除
NA
值的步骤

regmatches(yy, regexpr("(\\((\\d+)?(\\.(\\d)?\\)))", yy))
#[1] "(.)"   "(0.5)" "(3.2)"

另一个带有
gsub
的选项:

gsub("[^(]*(\\(([.0-9]+)\\)|\\b|\\B)[^)]*", "\\2", yy)
#[1] "."   ""    "0.5" ""    "3.2"
模式说明:
. <代码>[^(]*
:除开括号外的任何内容,0次或更多次
.
(\\([0-9]+)\\\\\\b \\\\b)
:我们要捕获的内容:一个开括号后跟一个点或多个数字,一次或多次,后跟一个闭括号(我们只想捕获点或数字部分,因此在替换部分捕获
\\2
)或可以位于单词边缘的空字符串(
\\b
)(
\\B
).N.B:这里我们不保留暂停时间的括号,但我们可以。
.
[^)]*
:除右括号外的任何内容,0次或多次

库(stringr);str\u extract\u all(yy,“\\(\\d+。\\d+\)\)\(\.\\)”
library(stringr)
vec <- str_extract(yy, "(\\((\\d+)?(\\.(\\d)?\\)))")
vec
#[1] "(.)"   NA      "(0.5)" NA      "(3.2)"
vec[!is.na(vec)]
#[1] "(.)"   "(0.5)" "(3.2)"
regmatches(yy, regexpr("(\\((\\d+)?(\\.(\\d)?\\)))", yy))
#[1] "(.)"   "(0.5)" "(3.2)"
gsub("[^(]*(\\(([.0-9]+)\\)|\\b|\\B)[^)]*", "\\2", yy)
#[1] "."   ""    "0.5" ""    "3.2"