【问题标题】:R: parse nested parenthesesR:解析嵌套括号
【发布时间】:2017-01-20 02:43:10
【问题描述】:

我想使用 R 解析嵌套括号。不,这不是 JASON。我见过使用 perl、php 和 python 的示例,但我无法在 R 中使用任何东西。这是一些数据的示例:

(a(a(a)(aa(a)a)a)a)((b(b)b)b)(((cc)c)c)

我想根据三个父括号将该字符串拆分为三个单独的字符串:

(a(a(a)(aa(a)a)a)a)

((b(b)b)b)

(((cc)c)c)

我面临的一个挑战是在父括号内的子括号对总数以及连续开括号或闭括号的数量方面缺乏一致的结构。请注意数据中带有 Bs 和 Cs 的连续开括号。这使得尝试使用正则表达式变得非常困难。此外,给定括号内的数据将与其他括号有许多共同字符,因此不可能查找所有“a”或“b” - 我捏造了这些数据以帮助人们更好地查看三个父括号。

基本上我正在寻找一个识别父括号的函数。换句话说,一个函数可以找到不包含在括号中的括号,并返回给定字符串的 this 的所有实例。

有什么想法吗?感谢您的帮助。

【问题讨论】:

    标签: r regex


    【解决方案1】:

    这里是直接改编自Regex Recursion和\\((?>[^()]|(?R))*\\):

    s = "(a(a(a)(aa(a)a)a)a)((b(b)b)b)(((cc)c)c)"
    matched <- gregexpr("\\((?>[^()]|(?R))*\\)", s, perl = T)
    substring(s, matched[[1]], matched[[1]] + attr(matched[[1]], "match.length") - 1)
    # [1] "(a(a(a)(aa(a)a)a)a)" "((b(b)b)b)"          "(((cc)c)c)"   
    

    【讨论】:

    • 这太棒了:-)
    【解决方案2】:

    假设有匹配的括号,你可以尝试以下(这就像一个PDA,下推自动机,如果你熟悉计算理论的话):

    str <- '(a(a(a)(aa(a)a)a)a)((b(b)b)b)(((cc)c)c)'
    indices <- c(0, which(cumsum(sapply(unlist(strsplit(str, split='')), 
                    function(x) ifelse(x == '(', 1, ifelse(x==')', -1, 0))))==0))
    sapply(1:(length(indices)-1), function(i) substring(str, indices[i]+1, indices[i+1]))
    # [1] "(a(a(a)(aa(a)a)a)a)" "((b(b)b)b)"          "(((cc)c)c)"         
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      • 2016-07-02
      相关资源
      最近更新 更多