R语言 使用正则表达式重新排列字符串

kknvjkwl  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(101)

我有一个字符串表达式,如下所示:

orig <- "mean(Sepal.Length, na.rm = TRUE)"
orig
#> [1] "mean(Sepal.Length, na.rm = TRUE)"

我想重新排列这个字符串,以便得到以下输出:

"Sepal.Length$mean(na.rm = TRUE)"
#> [1] "Sepal.Length$mean(na.rm = TRUE)"

我知道我可以像这样使用捕获组:

gsub("(Sepal.Length)", "\\1\\$", orig)
#> [1] "mean(Sepal.Length$, na.rm = TRUE)"

但这不适用于移动字符串中的文本:

gsub("(Sepal.Length)(.*)", "\\1\\$\\2", orig)
#> [1] "mean(Sepal.Length$, na.rm = TRUE)"

This question是有用的,但那里的解决方案是硬编码的,而这里我根本不知道我将拥有的表达式,只是它将包含Sepal.Length。例如,上面的表达式可以是"sum(Sepal.Length)"
我在寻找一个解决方案在基地R

slhcrj9b

slhcrj9b1#

您可以使用以下模式:

gsub("(.+)\\(Sepal\\.Length,? *(.*)\\)", "Sepal.Length$\\1(\\2)", orig)
  • (.+)匹配第一个括号\\(之前的任何内容;
  • 然后,我们总是有“萼片。长度”。请注意,.是一个特殊字符,所以要使用文字点,需要\\.;
  • 然后我们可能有一个逗号和空格,? *?表示“0或1次”,*表示“0或更多次”);
  • 之后,我们可能有其他参数(.*),后跟右括号\\)

编辑:感谢@rps1227提出的改进建议。

hpxqektj

hpxqektj2#

解析表达式给出p,在这种情况下,p2在第一个例子中是Sepal.Length,但可以是其他的东西,如第二个例子。然后将p转换为一个列表,并将第二个元素(第一个例子中的Sepal.Length)转换为NULL,然后将其转换为一个调用对象,再从调用对象转换为字符串。最后将p2粘贴到它的前面,使用$作为分隔符。不使用任何包或正则表达式,并且它与第一个参数名称是Sepal.Length还是其他名称无关。

f <- function(orig) {
  p <- str2lang(orig)
  paste(p[[2]], format(as.call(replace(as.list(p), 2, NULL))), sep = "$")
}

orig <- "mean(Sepal.Length, na.rm = TRUE)"
f(orig)
## [1] "Sepal.Length$mean(na.rm = TRUE)"

orig2 <- "sum(Sepal.Width)"
f(orig2)
## [1] "Sepal.Width$sum()"
46qrfjad

46qrfjad3#

如果你事先知道"Sepal.Length",那么你不需要regex把它贴在前面,你可以在那里paste

pattern = "Sepal.Length"

result = sub(pattern = paste0(pattern, ", "), replacement = "", x = orig, fixed = TRUE)
result = paste0(pattern, "$", result)
result
# [1] "Sepal.Length$mean(na.rm = TRUE)"

相关问题