python - 只有在数据帧中的特定单词前面时才替换星号
问题描述
我想在数据框列中编写一个不替换 * 如果前面有“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.*(?=\*)
,但它不起作用。似乎应该很简单,但我是正则表达式的初学者。任何帮助将不胜感激。
解决方案
你非常接近,因为你已经发现你想要一个lookbehind,但你的逻辑正好相反。
您想要一个匹配所有*
星号的模式,但条件是星号前面没有单词pay
。
pat = '(?<!pay.*)\*'
这个模式的意思是“如果当前位置没有紧跟在 ( (?<!
) 前面的字母pay
和任意数量的字符 ( ),则在当前位置.*
匹配一个星号 ( )”。\*
为了比较,您的模式pay.*(?=\*)
意味着“匹配任何pay
后跟任意数量的字符 ( .*
),条件是匹配的区域紧跟 ( (?=
) 后跟一个星号 ( \*
)”。
推荐阅读
- rest-assured - 如何提取没有“名称”的休息响应
- php - Laravel 合并指向一个表的两个关系的结果
- pdf - 智能卡数字签名 - 文档自签名以来已被更改或损坏
- python - 如何根据条件获取元组中的特定元素
- amazon-web-services - 无法从 Fargate 连接到 Snowflake
- algorithm - 查找出现在所有对中的两个整数
- mysql - 使用多个连接对大表进行 SQL 计数 - mysql 速度提示?
- angular - 在传单 on("click", function()) 操作后打开 Angular Material 对话框
- amazon-web-services - 获取 aws rds 快照的本地副本
- tfs - TFS (Azure DevOps) 通知 - 发送通知以开始发布部署