Python 如何在过滤器函数中反转正则表达式

Python 如何在过滤器函数中反转正则表达式,python,regex,pandas,Python,Regex,Pandas,我有以下熊猫数据帧df(这实际上只是一个大得多的数据帧的最后几行): 我可以使用filter的regex选项仅获取以两个下划线开头的行: df.filter(regex="^__", axis=0) 这将返回以下内容: count gene __no_feature 11697881 __ambiguous 1353 __too_l

我有以下熊猫数据帧
df
(这实际上只是一个大得多的数据帧的最后几行):

我可以使用
filter
regex
选项仅获取以两个下划线开头的行:

df.filter(regex="^__", axis=0)
这将返回以下内容:

                           count
gene                            
__no_feature            11697881
__ambiguous                 1353
__too_low_aQual                0
__not_aligned                  0
__alignment_not_unique         0
实际上,我想要的是补语:只有那些不以两个下划线开头的行

我可以用另一个正则表达式来实现这一点:
df.filter(regex=“^[^^\u][^\ u]”,axis=0)

有没有更简单的方法来指定我想要初始正则表达式的倒数?

这种基于regexp的过滤效率高吗?

编辑:测试一些建议的解决方案
df.filter(regex=“(?!^ _uuuuuuuu)”,axis=0)
df.filter(regex=“^\w+”,axis=0)
都返回所有行

根据
re
模块文档,
\w
特殊字符实际上包括下划线,这解释了第二个表达式的行为

我猜第一个不起作用,因为
(?!…)
适用于遵循模式的内容。此处,“^”应放在外部,如以下建议的解决方案所示:

df.filter(regex=“^(?!\uuu)。*?$”,axis=0)


df.filter(regex=“^(?!\uuuu)”,axis=0)也是如此

(?!^__) # a negative lookahead
        # making sure that there are no underscores right at the beginning of the line
或:


匹配没有两个前导下划线的所有行:

df.filter(regex="^__", axis=0)
^(?!\uuuuu)

^
匹配行的开头
(?!\uuuu)
确保行(前面的
^
匹配后面的内容)不以两个下划线开头

编辑:
删除了
*?$
,因为不需要筛选行。

我也遇到了同样的问题,但我想筛选列。因此,我使用axis=1,但概念应该类似

df.drop(df.filter(regex='my_expression').columns,axis=1)

(?!^\uuu)
可能就是您要找的。或者,也许更好:
^\w+
您可以从带有下划线的数据帧中获取索引,并将其从原始数据帧中排除。“新”索引可以像这样收集:
[idx表示原始的_df.index中的idx,如果idx不在下划线_df.index中]
,它有许多零匹配。更好:
^(?)。*?$
@RobinKoch:lazy dot star非常昂贵,在这里不需要。
(?!^\uu)
选择所有行,因为它匹配每个空字符串,该字符串后面没有新行和两个下划线。所以基本上一切都是这样。懒惰的点星非常昂贵,在这里不需要。
^(?!\uu)
也可以工作,并且避免了可能昂贵的星。对,我考虑过匹配行而不是过滤。奇怪的是,这两种工作都不起作用:所有行都被选中。我想我明白了原因:请参阅我问题末尾的编辑。
df.drop(df.filter(regex='my_expression').columns,axis=1)