【问题标题】:Help on regular expression正则表达式帮助
【发布时间】:2011-06-10 10:16:44
【问题描述】:

使用rSymPy 求解方程组,我得到了 x 和 y 的值,它们在这样的字符串中求解系统:

"[(1.33738072607023, 27.9489435205271)]"

我应该如何将这 2 个值分配给变量 x、y?

【问题讨论】:

    标签: regex r


    【解决方案1】:

    要拆分字符串,可以使用:

    vect <- as.numeric(strsplit(gsub("[^[:digit:]\\. \\s]","",x)," "))
    x <- vect[1]
    y <- vect[2]
    

    这将删除除空格、点或数字之外的所有内容。 strsplit 拆分向量中留下的字符串。另请参阅相关帮助文件。

    赋值可以在循环中完成,也可以使用 Gavin 函数。我只是命名它们。

    names(vect) <-c("x","y")
    vect["x"]
           x 
    1.337381
    

    对于更大的数据集,我喜欢将所有内容放在一起以避免名称过载。

    【讨论】:

    • @Joris,您可以将assign 附加到另一个环境中并附加它,这具有保持全局环境清洁但允许直接访问对象的效果。
    • 用于分配一些 x 和 y,这似乎太过分了。事实上,人们可以开始使用环境,但我个人更喜欢列表。完全一样,速度更快,调试麻烦更少。 YMMV
    • @Joris 响应“更大的数据集”行;同意这对于@Brani 的例子来说太过分了。我也喜欢列表,但您仍然必须索引列表才能访问组件或使用with(),除非您附加它...
    • @Gavin:在这种情况下,即使是命名向量也足够了。如果我想将非常不同和复杂的对象放在一起,我会觉得环境很有用。但除此之外,我在列表方面做得很好。你还必须告诉 R 你想要一个对象来自哪个环境,然后我相信索引工作得更快一些。
    【解决方案2】:

    这里有一些步骤可以完成您想做的事情。不能说它是最有效或最优雅的解决方案......

    string <- "[(1.33738072607023, 27.9489435205271)]"
    string <- gsub("[^[:digit:]\\. \\s]", "", string)
    splt <- strsplit(string, " ")[[1]]
    names(splt) <- c("x","y")
    FOO <- function(name, strings) {
        assign(name, as.numeric(strings[name]), globalenv())
        invisible()
    }
    lapply(c("x","y"), FOO, strings = splt)
    

    最后一行将返回:

    > lapply(c("x","y"), FOO, strings = splt)
    [[1]]
    NULL
    
    [[2]]
    NULL
    

    我们在全球环境中分配了xy

    > x
    [1] 1.337381
    > y
    [1] 27.94894
    

    【讨论】:

      【解决方案3】:

      gsubfn 包中的strapply 使得仅使用相对简单的正则表达式从字符串中提取数字变得相当容易。这里s 是输入字符串,v 是带有两个数字的数字向量:

      library(gsubfn)
      v <- strapply(s, "[0-9.]+", as.numeric)[[1]]
      x <- v[1]
      y <- v[2]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多