使用重新

时间:2016-05-04 14:52:05

标签: python regex python-3.x patsy

上下文:Python 3.4.3

我对正则表达式不是很了解,我似乎无法使用re找出一个强大的解决方案。

假设我们有一个长patsy formula,中间的某个地方是一个表达式:

... + 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-foo只产生如下内容:

re.sub('[^(]\s*xvar\s*',' FOUND IT ', 'y ~ xvar + np.log(xvar)')

可能是一个半复杂的if / else re.sub情况?

1 个答案:

答案 0 :(得分:2)

没有一般方法可以用正则表达式做你想做的事情,因为Patsy的公式语言不是常规语言。 (就像HTML is not a regular language一样。)

但是无论如何都没有必要去搞乱字符串 - 就像documented here一样,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)