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

ele*_*ora 2 python regex pandas

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

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

在我的例子中,用'foo'一词替换所有不包含单词fish的字段.

例如,假设数据帧是

applefish pear
water     afishfarm
Run Code Online (Sandbox Code Playgroud)

我希望将其转化为

applefish foo
foo       afishfarm 
Run Code Online (Sandbox Code Playgroud)

Psi*_*dom 6

你可以使用负向前看(?!)断言; ^(?!.*fish).*$首先断言模式不包含单词fish然后匹配每个东西直到字符串的结尾并将其替换为foo:

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

所以:

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

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

df
#                0          1
#0  applefish pear       pear
#1           water  afishfarm
Run Code Online (Sandbox Code Playgroud)

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

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


Vai*_*ali 6

您可以将 apply 与 str.contains 一起使用

df.apply(lambda x: x.replace(x[~x.str.contains('fish')], 'foo'))
Run Code Online (Sandbox Code Playgroud)

你得到

    0           1
0   applefish   foo
1   foo         afishfarm
Run Code Online (Sandbox Code Playgroud)

注意:我什至不推荐这样做,因为 Psidom 的解决方案效率更高。