在 R 中的多个定界符处拆分字符串表达式

splitting string expression at multiple delimiters in R

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

例如我想 2*(x1+x2-3*x3) 至 return "x1"、"x2"、"x3"

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

可能有更简洁的方法来执行此操作,但这是否涵盖您的用例?

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"

更一般地说,您可以使用此正则表达式:“([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"

您可以使用 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 代码。

更普遍地使用此模式(作为其符号数学,您可能有其他变量):“([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"