在Pandas数据处理场景中,经常会遇到需要裁剪字符串的需求,比如原始数据里的产品编码、用户标识等字段包含多余的连字符后缀,需要统一移除最后一个连字符及其后面的所有内容,让字段格式更规范。

实现核心思路
要实现这个需求,核心是利用Pandas的str.replace方法结合正则表达式的贪婪匹配特性。正则表达式需要匹配到最后一个连字符,以及连字符后面的所有内容,然后将其替换为空字符串即可。
正则表达式规则说明
对应的正则表达式可以写为-[^-]*$,各个部分的含义如下:
-:匹配连字符本身[^-]*:匹配除了连字符之外的任意字符,出现0次或多次,这里使用非贪婪的字符集是为了避免匹配到前面的连字符$:匹配字符串的结尾位置,确保我们匹配的是最后一个连字符及其后面的内容
基础实现代码示例
假设我们有一个包含待处理字符串的Pandas Series,具体实现代码如下:
import pandas as pd
# 构造测试数据
data = pd.Series([
"product-001-abc",
"user-2023-test",
"order-123",
"test-no-hyphen",
"single-"
])
# 使用正则表达式移除最后一个连字符及其后内容
result = data.str.replace(r'-[^-]*$', '', regex=True)
print("原始数据:")
print(data)
print("n处理后数据:")
print(result)
运行上述代码后,输出结果如下:
原始数据: 0 product-001-abc 1 user-2023-test 2 order-123 3 test-no-hyphen 4 single- dtype: object 处理后数据: 0 product-001 1 user-2023 2 order-123 3 test-no 4 dtype: object
特殊情况处理
处理没有连字符的字符串
如果原始字符串中不存在连字符,上述正则匹配不会生效,字符串会保持原样,不需要额外处理。比如上面的测试数据中如果没有连字符的条目,会直接返回原字符串。
处理连字符在末尾的情况
如果字符串最后一个字符就是连字符,正则-[^-]*$会匹配到这个连字符和后面的空内容,替换后连字符会被移除,结果就是去掉末尾连字符的字符串,符合预期效果。
在DataFrame中处理指定列
如果数据存储在DataFrame中,只需要对指定列调用str.replace方法即可,示例如下:
import pandas as pd
# 构造DataFrame测试数据
df = pd.DataFrame({
"id": [1, 2, 3, 4],
"code": ["a-b-c", "d-e", "f-", "g"]
})
# 处理code列
df["code_clean"] = df["code"].str.replace(r'-[^-]*$', '', regex=True)
print(df)
运行后输出的DataFrame中,code_clean列就是移除最后一个连字符及其后内容的结果。
注意事项
使用str.replace方法时,需要显式指定regex=True,否则Pandas会把第一个参数当作普通字符串处理,无法识别正则表达式规则。另外如果原始数据中存在缺失值NaN,str.replace会自动跳过缺失值,返回NaN,不需要额外做缺失值处理。
Pandas正则表达式字符串处理last_hyphen_removal修改时间:2026-07-15 02:00:20