如何用正则表达式移除Pandas列中指定单词后的首个单词(保留空格)
解决Pandas字符串列中移除指定关键词后首个单词(保留空格)的问题
问题分析
你需要在Pandas数据框的字符串列中,仅移除NO或WITHOUT之后的首个单词,同时完全保留这些关键词与后续内容之间的空格,不能删除或替换空格。原代码存在几个问题:
- 正则表达式开头多了不必要的斜杠
/(Python中不需要这种JS风格的正则分隔符) - 仅匹配了单个字符
\w,而非完整的单词\w+ - 没有正确保留捕获的空格部分
解决方案
使用正向肯定断言捕获NO/WITHOUT,同时单独捕获它们后面的所有空格,最后匹配要移除的完整单词。替换时只保留捕获的空格即可:
import pandas as pd df = pd.DataFrame({'STRING': [ r"THERE IS NO REASON WHY THIS SHOULDN'T WORK!", r"I AM WITHOUT DOUBT VERY BAD AT REGEX", r"I CAN'T SOLVE A PROBLEM THAT HAS NO INTRINSIC VALUE" ]}) # 正确的正则替换代码 df['desired_output'] = df.STRING.str.replace( r'(?<=(NO|WITHOUT))(\s+)\w+', # 匹配关键词+空格+首个单词,捕获空格 r'\2', # 替换为捕获的空格,移除单词 regex=True ) print(df[['STRING', 'desired_output']])
输出验证
运行后得到的结果完全符合期望:
| STRING | desired_output |
|---|---|
| THERE IS NO REASON WHY THIS SHOULDN'T WORK! | THERE IS NO WHY THIS SHOULDN'T WORK! |
| I AM WITHOUT DOUBT VERY BAD AT REGEX | I AM WITHOUT VERY BAD AT REGEX |
| I CAN'T SOLVE A PROBLEM THAT HAS NO INTRINSIC VALUE | I CAN'T SOLVE A PROBLEM THAT HAS NO VALUE |
正则说明
(?<=(NO|WITHOUT)):正向肯定断言,确保前面是NO或WITHOUT,不参与捕获替换(\s+):捕获关键词后面的所有连续空格,后续替换时保留这部分\w+:匹配关键词后的首个完整单词,这部分会被替换掉r'\2':引用第二个捕获组(即空格部分),实现只移除单词、保留空格的效果
内容的提问来源于stack exchange,提问作者Ankhnesmerira
相关产品推荐
相关产品推荐

