从正则表达式模式返回不匹配的行
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
【讨论】:
以上是关于从正则表达式模式返回不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章