代码之家  ›  专栏  ›  技术社区  ›  Chris Ruehlemann

使用r中的regex提取圆括号中的字符串

  •  3
  • Chris Ruehlemann  · 技术社区  · 6 年前

    在我的成绩单中,无声停顿用圆括号表示,例如(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 回复  |  直到 6 年前
        1
  •  2
  •   Ronak Shah    6 年前

    我们可以用 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 保存要删除的步骤 价值观。

    regmatches(yy, regexpr("(\\((\\d+)?(\\.(\\d)?\\)))", yy))
    #[1] "(.)"   "(0.5)" "(3.2)"
    
        2
  •  3
  •   Cath swolf    6 年前

    另一个选择 gsub :

    gsub("[^(]*(\\(([.0-9]+)\\)|\\b|\\B)[^)]*", "\\2", yy)
    #[1] "."   ""    "0.5" ""    "3.2"
    

    模式说明:
    . [^(]* :除左括号外的任何内容,0次或更多次
    . (\\(([.0-9]+)\\)|\\b|\\B) :我们要捕获的内容:一个或多个左括号后跟一个或多个点,一个或多个次,后跟一个右括号(因此,我们只希望捕获点或数字部分 \\2 在替换部分)或可以位于单词边缘的空字符串( \\b )是否( \\B ) 注意:这里我们不把括号放在停顿时间周围,但我们可以。
    . [^)]* :除右括号外的任何内容,0次或更多次