You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python不使用replace或split方法如何提取带版本号的原始文件名

问题背景

你之前使用原始文件名作为字典的key,参考代码如下:

key_dict = {"employee_details.csv": ["name","address","phone"]}

该文件名字符串从AWS S3存储桶中获取,现在ETL流程生成的文件会附加动态版本号,例如employee_details_0_0_0.csv,其中_0_0_0为可变的版本号字段,后续可能变更为其他数字组合(如_1_2_3)。
需求为不使用str.replace()或者str.split()方法,去除版本号部分得到原始文件名,输入输出示例如下:
输入示例:

input 1 : employee_details_0_0_0.csv
input 2 : employee_details_1_2_3.csv

期望输出:

output 1 : employee_details.csv 
output 2 : employee_details.csv 
解决方案

你可以通过两种方式实现需求,均符合禁用方法的要求:

方案1:使用字符串内置rfind()方法(无需引入额外依赖)

核心思路是定位到.csv后缀前最后一个属于版本号前缀的下划线位置,截断后拼接后缀即可:

def get_original_filename(filename: str) -> str:
    # 仅处理csv格式文件,可根据实际需求拓展其他后缀规则
    if not filename.endswith(".csv"):
        return filename
    # 跳过.csv后缀的4个字符,向前查找最后一个下划线的索引
    split_idx = filename.rfind("_", 0, len(filename) - 4)
    if split_idx == -1:
        # 未匹配到版本号前缀下划线,说明是无版本号的原始文件,直接返回
        return filename
    return f"{filename[:split_idx]}.csv"

测试效果:

print(get_original_filename("employee_details_0_0_0.csv"))
# 输出:employee_details.csv
print(get_original_filename("employee_details_1_2_3.csv"))
# 输出:employee_details.csv

方案2:使用正则表达式匹配(灵活性更高,适配后续版本号规则变更)

通过正则捕获原始文件名前缀,自动忽略中间由数字和下划线组成的版本段:

import re

def get_original_filename(filename: str) -> str:
    # 正则规则:捕获任意前缀 + 匹配一段以上「下划线+数字」组成的版本段 + .csv后缀
    match_result = re.fullmatch(r"(.+?)(?:_\d+)+?\.csv", filename)
    if match_result:
        return f"{match_result.group(1)}.csv"
    return filename

测试效果与方案1完全一致。


内容的提问来源于stack exchange,提问作者shivthedev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 09:48:03