上下文: Python 3.4.3
我不太擅长正则表达式,而且我似乎无法用re找到一个健壮的解决方案。
假设我们有一个长的patsy公式,中间的某个地方是这样的表达式:
... + xvar + np.log(xvar)+xvar**2 + xvar2+ z...Patsy公式只是遵循行为良好的规则的字符串,所以我想知道是否有人已经/能够轻松地编写一个健壮的方法,从给定的公式中删除特定的术语?因此,例如:
>>> remove_term(long_formula, 'xvar')
... + np.log(xvar)+xvar**2 + xvar2+ z...和
>>> remove_term(long_formula, 'xvar2')
... + xvar + np.log(xvar)+xvar**2 + z...这也需要在右手边公式规范的开头/结尾有一个变量的鲁棒性。
我有限的regex只产生这样的东西:
re.sub('[^(]\s*xvar\s*',' FOUND IT ', 'y ~ xvar + np.log(xvar)')也许是半复杂的if/否则re.sub的情况?
发布于 2016-05-20 03:02:34
没有一种通用的方法可以使用正则表达式来完成您想要做的事情,因为Patsy的公式语言不是一种常规语言。(就像HTML不是一种常规语言一样。)
但无论如何,没有必要乱搞字符串--作为记录在这里,patsy作为其公共API的一部分为公式提供了一个很好的面向对象的表示形式。在内部,每次调用dmatrix时都会使用这个方法:公式字符串被解析成这个表示,然后这个表示就是下游所有东西所使用的。但是您也可以直接使用它,比如:
In [3]: m = patsy.ModelDesc.from_formula("xvar + np.log(xvar)+xvar**2 + xvar2")
In [4]: m
Out[4]:
ModelDesc(lhs_termlist=[],
rhs_termlist=[Term([]),
Term([EvalFactor('xvar')]),
Term([EvalFactor('np.log(xvar)')]),
Term([EvalFactor('xvar2')])])
In [5]: m.rhs_termlist.remove(patsy.Term([patsy.EvalFactor('xvar')]))
In [6]: m
Out[6]:
ModelDesc(lhs_termlist=[],
rhs_termlist=[Term([]),
Term([EvalFactor('np.log(xvar)')]),
Term([EvalFactor('xvar2')])])然后将m传递给需要一个公式的patsy函数,比如patsy.dmatrix(m, dataframe)。
https://stackoverflow.com/questions/37031272
复制相似问题