首页 > 解决方案 > 只有在数据帧中的特定单词前面时才替换星号

问题描述

我想在数据框列中编写一个不替换 * 如果前面有“pay”一词,否则用空格替换 * 的正则表达式。

例如,如果我有这个 dataframe: pd.DataFrame({'a':['pay * jaf',"df*kafds","*fjas","kf8* 8*jkds"]}),它应该只在第一行留下 * ,然后对于其余的,它应该用空格替换它。

所以如果我这样做df["col"] = df["col"].str.replace(pat, ' '),它应该返回pd.DataFrame({'a':['pay * jaf',"df kafds"," fjas","kf8 8 jkds"]})

我无法想出做到这一点的正则表达式。目前,我有这种模式pay.*(?=\*),但它不起作用。似乎应该很简单,但我是正则表达式的初学者。任何帮助将不胜感激。

标签: pythonregexpandas

解决方案


你非常接近,因为你已经发现你想要一个lookbehind,但你的逻辑正好相反。

您想要一个匹配所有*星号的模式,但条件是星号前面没有单词pay

pat = '(?<!pay.*)\*'

这个模式的意思是“如果当前位置没有紧跟在 ( (?<!) 前面的字母pay和任意数量的字符 ( ),则在当前位置.*匹配一个星号 ( )”。\*

为了比较,您的模式pay.*(?=\*)意味着“匹配任何pay后跟任意数量的字符 ( .*),条件是匹配的区域紧跟 ( (?=) 后跟一个星号 ( \*)”。


推荐阅读