【问题标题】:splitting string expression at multiple delimiters in R在R中的多个分隔符处拆分字符串表达式
【发布时间】:2015-01-11 21:09:26
【问题描述】:

我正在尝试解析 R 中的一些数学表达式,因此我想将它们拆分为多个分隔符 +,-,*,/, -(, +(, ), )+ 等,以便我获得表达式中包含的符号变量列表。

所以例如我想 2*(x1+x2-3*x3) 返回 “x1”、“x2”、“x3”

有什么好的方法吗?谢谢。

【问题讨论】:

    标签: regex r strsplit


    【解决方案1】:

    您可以使用 R 解析器来查找表达式中的特定符号,而不是使用正则表达式。如果我回收find_vars() 函数形式this answer。你可以这样做

    extract_vars <- function(x) {
        find_vars(parse(text=x)[[1]])$found
    }
    expr <- "2*(x1+x2-3*x3)"
    extract_vars(expr)
    # [1] "x1" "x2" "x3"
    

    当然,此方法假定您的用户输入的所有数学表达式也是语法有效的 R 代码。

    【讨论】:

      【解决方案2】:

      可能有一种更简洁的方法,但这是否涵盖了您的用例?

      eqn = "3 + 2*(x1+x2-3*x3 - x1/x3) - 5"
      
      vars = unlist(strsplit(eqn, split="[-+*/)( ]|[^x][0-9]+|^[0-9]+"))
      vars = vars[nchar(vars)>0]  # To remove empty strings
      
      vars
      [1] "x1" "x2" "x3" "x1" "x3"
      

      如果您只希望每个唯一值显示一次,您可以这样做:

      vars = unlist(strsplit(eqn, split="[-+*/)( ]|[^x][0-9]+|^[0-9]+"))
      vars = unique(vars[nchar(vars)>0])
      
      vars
      [1] "x1" "x2" "x3"
      

      【讨论】:

        【解决方案3】:

        通常你可以使用这个正则表达式:“([A-z]\d)”

        library(stringr)
        f <- "2*(x1+x2-3*x3)"
        pattern <- "([A-z]\\d)"
        str_extract_all(f, pattern)
        [[1]]
        [1] "x1" "x2" "x3"
        

        【讨论】:

          【解决方案4】:

          更普遍地使用这种模式(作为它的符号数学你可能有其他变量):“([A-z]\d)”

          library(stringr)
          # A little different example
          var <- "2x1*(x1+x2-3*x3)*y1"
          pattern <- "([A-z]\\d)"
          str_extract_all(var,pattern)  
          [[1]]
          [1] "x1" "x1" "x2" "x3" "y1"
          

          【讨论】:

          • 我写了那个解决方案,但我注意到我离线(我第一次回答)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-21
          • 1970-01-01
          • 2017-02-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多