【发布时间】:2015-01-11 21:09:26
【问题描述】:
我正在尝试解析 R 中的一些数学表达式,因此我想将它们拆分为多个分隔符 +,-,*,/, -(, +(, ), )+ 等,以便我获得表达式中包含的符号变量列表。
所以例如我想 2*(x1+x2-3*x3) 返回 “x1”、“x2”、“x3”
有什么好的方法吗?谢谢。
【问题讨论】:
我正在尝试解析 R 中的一些数学表达式,因此我想将它们拆分为多个分隔符 +,-,*,/, -(, +(, ), )+ 等,以便我获得表达式中包含的符号变量列表。
所以例如我想 2*(x1+x2-3*x3) 返回 “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 代码。
【讨论】:
可能有一种更简洁的方法,但这是否涵盖了您的用例?
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"
【讨论】:
更普遍地使用这种模式(作为它的符号数学你可能有其他变量):“([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"
【讨论】: