首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用re删除Patsy公式中的项

用re删除Patsy公式中的项
EN

Stack Overflow用户
提问于 2016-05-04 14:52:04
回答 1查看 166关注 0票数 0

上下文: Python 3.4.3

我不太擅长正则表达式,而且我似乎无法用re找到一个健壮的解决方案。

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

代码语言:javascript
复制
... + xvar + np.log(xvar)+xvar**2 + xvar2+ z...

Patsy公式只是遵循行为良好的规则的字符串,所以我想知道是否有人已经/能够轻松地编写一个健壮的方法,从给定的公式中删除特定的术语?因此,例如:

代码语言:javascript
复制
>>> remove_term(long_formula, 'xvar')
... + np.log(xvar)+xvar**2 + xvar2+ z...

代码语言:javascript
复制
>>> remove_term(long_formula, 'xvar2')
... + xvar + np.log(xvar)+xvar**2 + z...

这也需要在右手边公式规范的开头/结尾有一个变量的鲁棒性。

我有限的regex只产生这样的东西:

代码语言:javascript
复制
re.sub('[^(]\s*xvar\s*',' FOUND IT ', 'y ~ xvar + np.log(xvar)')

也许是半复杂的if/否则re.sub的情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-20 03:02:34

没有一种通用的方法可以使用正则表达式来完成您想要做的事情,因为Patsy的公式语言不是一种常规语言。(就像HTML不是一种常规语言一样。)

但无论如何,没有必要乱搞字符串--作为记录在这里,patsy作为其公共API的一部分为公式提供了一个很好的面向对象的表示形式。在内部,每次调用dmatrix时都会使用这个方法:公式字符串被解析成这个表示,然后这个表示就是下游所有东西所使用的。但是您也可以直接使用它,比如:

代码语言:javascript
复制
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)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37031272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档