我正在尝试解析R中的一些数学表达式,因此我想将它们拆分为多个分隔符 +, - ,*,/, - (,+(,),)+ 等等,以便我得到表达式中包含的符号变量列表。
所以,例如我想要 2 *(X1 + x2-3 * X3) 回来 " x1"," x2"," x3"
有没有好办法呢?感谢。
答案 0 :(得分: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"
答案 1 :(得分:2)
您可以使用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 :(得分:1)
更一般地说,您可以使用此正则表达式:“([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"
答案 3 :(得分:1)
更一般地使用这种模式(因为它的符号数学可能有其他变量):“([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"