Python Pandas如何高效清除文本列中连续重复的X字符
问题场景
pandas DataFrame包含文本列,因个人信息脱敏处理,文本中大量个人数据被替换为X标识,存在X、XX、XXX等多种长度的连续X字符(含小写x情况)。需要统一清除所有这类连续X字符,但现有清洗代码需要枚举所有X的连续长度组合,实用性差。
现有测试代码如下:
def cleanning(Complaint): Complaint = re.sub(r'#+/', ' ', Complaint) Complaint = re.sub("\d", "\s", Complaint) Complaint = re.sub("XX", "XXXX", Complaint) Complaint = re.sub("xx", "xxxx", Complaint) Complaint = re.sub("@", "XXXXXXXX", Complaint) Complaint = Complaint.replace('\n', ' ') Complaint = Complaint.replace('\r', ' ') return Complaint
优化实现方案
核心是利用正则的重复匹配量词+(匹配前序字符1次及以上),一次性命中任意长度的连续X字符,不需要枚举不同长度组合:
- 用正则规则
r'[Xx]+'即可匹配所有1个及以上长度的连续大写X、小写x,不管连续多少个X都能一次性命中 - 原代码中「XX替换为XXXX」「@替换为8个X」的逻辑属于冗余绕路,匹配到连续X后可直接做目标替换(删除或替换为统一脱敏标识)
- 修正原代码中数字替换的转义问题,补充多连续空格合并的可选优化,避免清洗后文本出现大量冗余空白
优化后的清洗代码:
import re def cleaning(complaint_text): # 替换连续#+/格式字符为空格 complaint_text = re.sub(r'#+/', ' ', complaint_text) # 替换所有数字为空格 complaint_text = re.sub(r'\d', ' ', complaint_text) # 核心:一次性清除所有任意长度的连续X/x字符 # 如果需要保留统一脱敏标识,可把''替换为目标值,比如'[脱敏]'或固定长度'XX' complaint_text = re.sub(r'[Xx]+', '', complaint_text) # 替换@字符、换行、回车为空格 complaint_text = complaint_text.replace('@', ' ') complaint_text = complaint_text.replace('\n', ' ').replace('\r', ' ') # 可选:合并多个连续空格为单个,去除首尾空白 complaint_text = re.sub(r'\s+', ' ', complaint_text).strip() return complaint_text
对DataFrame文本列批量清洗时,直接调用apply即可:
# 假设文本列名为Complaint,清洗后结果存入cleaned_complaint列 df['cleaned_complaint'] = df['Complaint'].apply(cleaning)
如果需求不是删除X标记,而是把所有不同长度的连续X统一为固定长度的脱敏标识,只需要修改
re.sub(r'[Xx]+', '', complaint_text)这一行的替换值即可,比如替换为'XX'就能实现所有长度连续X统一为2个X的效果,不需要额外写多层替换逻辑。
内容的提问来源于stack exchange,提问作者DiegoIE
相关产品推荐
相关产品推荐

