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

r中的regex与方括号中的字符串匹配

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

    我有讲故事的抄本,其中有许多重叠演讲的实例,用方括号表示,这些方括号围绕着重叠的演讲。我想提取这些重叠的实例。在下面的模拟示例中,

    ovl <- c("well [yes right]", "let's go", "oh [  we::ll] i do n't (0.5) know", "erm [°well right° ]", "(3.2)")
    

    此代码工作正常:

    pattern <- "\\[(.*\\w.+])*"
    grep(pattern, ovl, value=T) 
    matches <- gregexpr(pattern, ovl) 
    overlap <- regmatches(ovl, matches)
    overlap_clean <- unlist(overlap); overlap_clean
    [1] "[yes right]"     "[  we::ll]"      "[°well right° ]"
    

    但在一个更大的文件中,数据帧不是这样的。这是因为模式中的一个错误,还是因为数据帧的结构?df的前六行如下:

    > head(df)
                                                                 Story
    1 "Kar:\tMind you our Colin's getting more like your dad every day
    2                                             June:\tI know he is.
    3                                 Kar:\tblack welding glasses on, 
    4                        \tand he turned round and he made me jump
    5                                                 \t“O:h, Colin”, 
    6                                  \tand then (                  )
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Tim Biegeleisen    6 年前

    虽然它可能在某些情况下起作用,但您的模式对我很有吸引力。我认为应该是这样:

    pattern <- "(\\[.*?\\])"
    matches <- gregexpr(pattern, ovl)
    overlap <- regmatches(ovl, matches)
    overlap_clean <- unlist(overlap)
    overlap_clean
    
    [1] "[yes right]"     "[  we::ll]"      "[°well right° ]"
    

    Demo

    这将匹配并捕获一个带括号的术语,使用perl lazy点确保我们停在第一个右括号处。

        2
  •  1
  •   Wiktor Stribiżew    5 年前

    匹配字符串 [ ] 中间没有方括号

    "\\[[^][]*]"
    

    它会匹配的 [a] 在里面 [a[a] 字符串,不同于 \[.*?] 模式。

    细节

    • \[ -A [ 烧焦
    • [^][]* -与任何0个或多个字符匹配的负括号表达式(或字符类),而不是 [ ]
    • ] -A ] char(不需要在字符类/括号表达式之外转义它)

    查看 Regulex graph :

    enter image description here

    查看 R demo online :

    ovl <- c("well [yes right]", "let's go", "oh [  we::ll] i do n't (0.5) know", "erm [°well right° ]", "(3.2)")
    unlist(regmatches(ovl, gregexpr("\\[[^][]*]", ovl)))
    ## => [1] "[yes right]"     "[  we::ll]"      "[°well right° ]"
    

    stringr::str_extract_all :

    library(stringr)
    ovl <- c("well [yes right]", "let's go", "oh [  we::ll] i do n't (0.5) know", "erm [°well right° ]", "(3.2)")
    unlist(str_extract_all(ovl, "\\[[^\\]\\[]*]"))
    ## => [1] "[yes right]"     "[  we::ll]"      "[°well right° ]"
    

    在这里,由于模式是用icu regex库处理的,所以需要从regex模式中的两个方括号中退出。