从正则表达式模式返回不匹配的行

Posted

技术标签:

【中文标题】从正则表达式模式返回不匹配的行【英文标题】:Return the unmatched rows from the regex pattern 【发布时间】:2018-01-15 08:36:03 【问题描述】:

如果我有一个看起来像这样的 pandas 数据框:

      Sequence     Rating
 0    HYHIVQKF     1
 1    YGEIFEKF     2
 2    TYGGSWKF     3
 3    YLESFYKF     4
 4    YYNTAVKL     5
 5    WPDVIHSF     6

这是我正在使用的代码,它返回与以下模式匹配的行: \b.[YF]\w+[LFI]\b

pat = r'\b.[YF]\w+[LFI]\b'
new_df.Sequence.str.contains(pat)

new_df[new_df.Sequence.str.contains(pat)]

上面的代码是返回匹配模式的行,但是我可以用什么来返回不匹配的行呢?

预期输出:

     Sequence  Rating
1    YGEIFEKF   2
3    YLESFYKF   4
5    WPDVIHSF   6

【问题讨论】:

【参考方案1】:

您可以将~ 用于not:

pat = r'\b.[YF]\w+[LFI]\b'
new_df[~new_df.Sequence.str.contains(pat)]

#   Sequence    Rating
#1  YGEIFEKF    2
#3  YLESFYKF    4
#5  WPDVIHSF    6

【讨论】:

【参考方案2】:

您可以对现有的布尔系列进行否定:

df[~df.Sequence.str.contains(pat)]

这将为您提供所需的输出:

   Sequence  Rating
1  YGEIFEKF       2
3  YLESFYKF       4
5  WPDVIHSF       6

简要说明:

df.Sequence.str.contains(pat)

将返回一个布尔系列:

0     True
1    False
2     True
3    False
4     True
5    False
Name: Sequence, dtype: bool

使用~ 否定它会产生

~df.Sequence.str.contains(pat)

0    False
1     True
2    False
3     True
4    False
5     True
Name: Sequence, dtype: bool

这是您可以传递给原始数据框的另一个布尔系列。

【讨论】:

【参考方案3】:

Psidom's answer 更优雅,但解决此问题的另一种方法是修改正则表达式模式以使用否定前瞻断言,然后使用match() 代替contains()

pat = r'\b.[YF]\w+[LFI]\b'
not_pat = r'(?!)'.format(pat)

>>> new_df[new_df.Sequence.str.match(pat)]
   Sequence  Rating
0  HYHIVQKF       1
2  TYGGSWKF       3
4  YYNTAVKL       5

>>> new_df[new_df.Sequence.str.match(not_pat)]
   Sequence  Rating
1  YGEIFEKF       2
3  YLESFYKF       4
5  WPDVIHSF       6

【讨论】:

以上是关于从正则表达式模式返回不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

Linux基础6-1 grep和正则表达式

grep正则表达式

从 BigTable 中删除与 BigTable 中的正则表达式匹配的行

正则表达式

正则和grep——再做正则就去死

正则表达式