Python文本替换函数误删数字问题求助
问题解决:清理DataFrame列名时保留数字
问题原因
你的函数里的正则表达式r"[()\[\]&^%$#@!-:'\/]"存在关键错误:字符集中的-放在!和:之间时,会被解析为ASCII字符范围(!的ASCII码是33,:是58),而数字字符(ASCII 48-57)正好落在这个范围内,导致正则把数字也一并删除,最终丢失了10706。
修复后的函数
将-移到字符集的开头或结尾,避免被识别为范围符号,同时优化代码逻辑减少重复操作:
import re def text_replacement(x): """ 格式化字段名,使其更符合SQL规范 """ # 先处理自定义字段替换 for key, value in custom_fields_dict.items(): pattern = re.compile(key, re.IGNORECASE) x = pattern.sub(value, x) # 统一处理字符串格式,放在循环外避免重复执行 x = (x.lower() .replace('fields.', '') .replace(' ', '_') .replace('™', '')) # 修正正则:把-移到字符集末尾,仅匹配减号本身 x = re.sub(r"[()\[\]&^%$#@!:'\/-]", '', x) return x # 测试示例 test_str = "standard_access_requested_application:_'role/group': ]ld_10706(e)™" print(text_replacement(test_str)) # 输出:standard_access_requested_application_rolegroup_ld_10706e
优化说明
- 正则修正:将
-移到字符集末尾,确保它只匹配减号,不再覆盖数字范围 - 逻辑优化:把
lower()、replace()等通用处理放在循环外,避免每次循环重复执行,提升性能 - 保留数字:修复后正则仅删除指定特殊符号,数字会被完整保留
DataFrame列名替换简化写法
可以用列表推导式简化列名替换代码:
df.columns = [text_replacement(col) for col in df.columns]
内容的提问来源于stack exchange,提问作者elia_Werner
相关产品推荐
相关产品推荐

