regex - 正则表达式选择逗号但不在括号之间

标签 regex r string

我想在 R 中创建一个函数来加载给定函数的默认值。为此,我在函数上使用了 args 参数,并希望将其分解为函数的默认参数并将它们加载到全局环境中。这需要一些正则表达式,并且遇到了我难以解决的问题。

这是一个示例函数:

myFunc <- function(a = 1, b = "hello world", c = c("Hello", "World")) {}

我已经使用我自己的函数将其归结为这一点:

x <- "a = 1, b = \"hello world\", c = c(\"Hello\", \"World\")"

但是,我遇到困难的地方在于拆分函数参数。我想用逗号分割,但如果你有一个函数参数,它在默认值中有一个逗号(就像 c 参数那样),那么这会导致问题。我在想的是,如果有一种方法可以调用匹配逗号的正则表达式,而不是两个括号之间的逗号 this,那么我可以将 strsplit 与该表达式一起使用来获得我想要的想要。

我尝试匹配两个括号之间逗号的大小写,如下所示:

\\(.*,.*\\)

现在,我研究了如何做我上面描述的事情,看起来消极的展望可能是我需要的,所以我尝试做这样的事情。

splitx <- strsplit(x, "(?!\\(.*,.*\\)(,)")

但是 R 告诉我这是一个非法的正则表达式。如果我在参数中设置 perl = TRUE,它只会返回相同的字符串。非常感谢此处的任何帮助,我希望我已经说清楚了!

最佳答案

我将尝试回答您的基本问题。

函数 formals() 返回函数形式参数的对列表。您可以通过测试 is.symbol()is.null() 来使用 formals() 的结果。任何不是符号且也不为 null 的东西都包含一个默认值。

例如:

get_default_args <- function(fun){
  x <- formals(fun)
  w <- sapply(x, function(x)!is.symbol(x) && !is.null(x))
  x[w]
}

lm() 上试试:

get_default_args(lm)
$method
[1] "qr"

$model
[1] TRUE

$x
[1] FALSE

$y
[1] FALSE

$qr
[1] TRUE

$singular.ok
[1] TRUE

在你的函数上试试:

myFunc <- function(a = 1, b = "hello world", c = c("Hello", "World")) {}
get_default_args(myFunc)
$a
[1] 1

$b
[1] "hello world"

$c
c("Hello", "World")

请注意,注释建议使用 match.call()。这可能对您有用,也可能不适合您,但是 match.call() 会在被调用后在函数的环境中计算参数,而 formals() 评估语言对象本身。因此,在使用 formals() 时根本不需要调用该函数。

关于regex - 正则表达式选择逗号但不在括号之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133597/

相关文章:

python - 字典内的字符串格式?

java - 如何分割字符串并分配唯一的ID

python - 使用Python提取包含单词的句子...以及它周围的句子?

r - 使用 R 将 data.frame 转换为简单向量

JavaScript 正则表达式 for Money 非 JQuery

r - 更改 stat_binhex 中的计数范围

c++ - R:在 C++ 中抑制来自 Rprintf 的消息

java - java中的正则表达式查找字符串是否采用尾随零的十进制数格式

python - Python中结合正则表达式读取文本

java - 将转义的转义序列替换为其未转义的值