Python 用re从Patsy公式中删除项

Python 用re从Patsy公式中删除项,python,regex,python-3.x,patsy,Python,Regex,Python 3.x,Patsy,上下文:Python 3.4.3 我对正则表达式不是很在行,而且我似乎无法使用re找到一个健壮的解决方案 假设我们有一个很长的,中间的某个地方有一个表达式: ... + xvar + np.log(xvar)+xvar**2 + xvar2+ z... Patsy公式只是遵循良好规则的字符串,所以我想知道是否有人编写过/能够轻松编写一个健壮的方法,用于从给定公式中删除特定项?例如: >>> remove_term(long_formula, 'xvar') ... + np.

上下文:Python 3.4.3

我对正则表达式不是很在行,而且我似乎无法使用
re
找到一个健壮的解决方案

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

... + xvar + np.log(xvar)+xvar**2 + xvar2+ z...
Patsy公式只是遵循良好规则的字符串,所以我想知道是否有人编写过/能够轻松编写一个健壮的方法,用于从给定公式中删除特定项?例如:

>>> remove_term(long_formula, 'xvar')
... + np.log(xvar)+xvar**2 + xvar2+ z...

等等。这还需要在右侧公式规范的开始/结束处具有一个变量

我有限的regex foo只生产以下产品:

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

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

没有通用的方法来处理正则表达式,因为Patsy的公式语言不是正则语言。(就像这样。)

但是,无论如何都不需要去摆弄字符串——因为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)

没有通用的方法来处理正则表达式,因为patsy的公式语言不是正则语言。(就像这样。)

但是,无论如何都不需要去摆弄字符串——因为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)

您能提供更多详细信息吗?当它是一系列加法/减法运算的一部分时,您是否只希望删除
xvar
?似乎您不想删除括号内的内容…尝试用空格替换。你能提供更多的细节吗?当它是一系列加法/减法运算的一部分时,您是否只希望删除
xvar
?似乎您不想删除括号内的内容…尝试用空格替换。看到这个了吗