如何否定pandas替换的正则表达式

时间:2017-08-31 17:44:00

标签: python regex pandas

在pandas中,我可以搜索并替换包含单词fish的所有字段,例如,使用df.replace(r'.*fish.*', 'foo', regex = True)

  

但是如何搜索和替换所有不包含的字段   字鱼?

在我的示例中,将所有不包含单词fish的字段替换为单词'foo'。

例如,假设数据框是

applefish pear
water     afishfarm

我希望将其转换为

applefish foo
foo       afishfarm 

2 个答案:

答案 0 :(得分:6)

您可以使用负面预测(?!)断言; ^(?!.*fish).*$首先声明模式不包含单词fish,然后匹配每个字符串直到字符串结尾并将其替换为foo

  • ^表示字符串的开头,与(?!.*fish)结合,它在BOS断言字符串中没有.*fish之类的模式;
  • 如果断言成功,它会匹配所有内容,直到字符串.*$结束,并将其替换为foo;如果断言失败,模式不匹配,则不会发生任何事情;

这样:

df.replace(r'^(?!.*fish).*$', 'foo', regex=True)
#           0           1
#0  applefish         foo
#1        foo   afishfarm

如果字符串可以包含多个单词:

df
#                0          1
#0  applefish pear       pear
#1           water  afishfarm

您可以使用字边界\b替换^和字符\w来替换.

df.replace(r'\b(?!.*fish)\w+', 'foo', regex=True)
#               0           1
#0  applefish foo         foo
#1            foo   afishfarm

答案 1 :(得分:3)

您可以使用apply with str.contains

df.apply(lambda x: x.replace(x[~x.str.contains('fish')], 'foo'))

你得到了

    0           1
0   applefish   foo
1   foo         afishfarm

注意:我甚至不建议这样做,因为Psidom的解决方案效率更高。