如何使用Pandas正则表达式移除字符串中最后一个连字符及其后所有内容
本文介绍如何利用Pandas的str.replace()配合正则表达式,精准删除每行字符串中最后一次出现的连字符(-)及其右侧全部内容,保留左侧完整结构,适用于ID清洗、版本号截取等场景。
本文介绍如何利用pandas的`str.replace()`配合正则表达式,精准删除每行字符串中**最后一次出现的连字符(-)及其右侧全部内容**,保留左侧完整结构,适用于id清洗、版本号截取等场景。
在数据清洗过程中,常需从类似 FUHV2-DEN 或 FUHV2-FOO-DEN 的标识符中提取主干部分(如 FUHV2 或 FUHV2-FOO),即移除最后一个连字符及之后的所有字符。虽然 str.split('-').str[:-1].str.join('-') 看似可行,但它存在明显缺陷:对不含连字符的字符串会返回空字符串(如 FUH07V2NUM → ''),且逻辑冗余、可读性差。
更可靠、高效的做法是使用正则表达式配合 str.replace():
df['out'] = df['ID'].str.replace(r'-[^-]*$', '', regex=True)
✅ 正则解析:
MaxAI
MaxAI.me是一款功能强大的浏览器AI插件,集成了多种AI模型。
- - :匹配字面量连字符;
- [^-]* :匹配零个或多个非连字符(确保捕获的是最后一段);
- $ :锚定到字符串末尾;
- 整体 r'-[^-]*$' 表示“以连字符开头、后跟任意非连字符、并位于字符串最末端”的子串——即最后一个连字符及其后续内容。
- 替换为空字符串 '',即实现“移除”。
? 效果示例:
| Name1 | ID | ID_SPLIT | ID_SPLIT2 | out |
|--------|---------------|----------|-----------|-----------|
| FUH-V2 | FUH07V2NUM | None | None | FUH07V2NUM |
| FUH-V2 | FUHV2-DEN | FUHV2 | FUHV2 | FUHV2 |
| FUH-V2 | FUH30V2NUM | None | None | FUH30V2NUM |
| FUH-V2 | FUHV2-FOO-DEN | None | None | FUHV2-FOO |
⚠️ 注意事项:
- 必须显式指定 regex=True(Pandas 2.0+ 默认为 True,但为兼容性和可读性建议保留);
- 若原始字段含缺失值(NaN),str.replace() 会自动保持 NaN 不变,无需额外处理;
- 该方法仅影响末尾的连字符段,中间连字符(如 FUHV2-FOO-DEN 中的 -FOO-)完全保留。
? 进阶提示:若需同时处理多种分隔符(如 -、_、.),可扩展正则为 r'[-_.][^-_.]*$',原理相同,灵活适配业务需求。