0

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

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

也许是一个半复杂的 if/elsere.sub情况?

4

1 回答 1

2

没有通用的方法可以用正则表达式做你想做的事情,因为 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).

于 2016-05-20T03:02:34.350 回答