如何使用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'[-_.][^-_.]*$',原理相同,灵活适配业务需求。

相关推荐:

如何使用Python Pandas从网页HTML中抓取表格数据?

pd.read_html()是解析网页表格的最简路径,但对嵌套table、JS渲染、colspan/rowspan过多等结构敏感;遇JS渲染需用Playwright等待DOM加载后再解析;应显式指定header、skiprows并清理列名,同时设置超时、缓存HTML、捕获具体异常以保障稳定性。 用p...

如何使用Python Selenium处理网页中的iframe框架?

iframe切换失败的典型表现是页面有iframe但找不到子元素、click()无反应、send_keys()无效;根本原因是Selenium默认只操作顶层文档,需显式切换上下文。 直接操作iframe内的元素一定会失败,因为WebDriver默认只在顶层文档中查找DOM;必须先用switch_to...