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
相关产品推荐
相关产品推荐

