多分隔符文件名拆分异常:如何正确拆分至指定变量
解决文件名拆分中rest字段的异常问题
问题分析
从示例文件名和预期拆分结果可以明确文件名的固定结构:[rest]-[operation].[trans].[type]
其中:
type是文件名最后一个.后的后缀trans是倒数第二个.和最后一个.之间的内容operation是最后一个-和倒数第二个.之间的内容rest是第一个字符到最后一个-之前的全部内容(可能包含-)
你之前用split("-", file)[0]获取rest的问题在于:文件名中存在多个-时,该方法会拆分所有-并取第一个片段,无法保留rest中包含的-。
解决方案
核心是定位最后一个-的位置,将其作为rest和operation的分割点,再分别提取其他字段。以下提供两种常用实现方式:
方式1:正则表达式匹配
使用正则可以一次性匹配出所有字段,适合结构化处理:
正则模式:^(.*)-([^-.]+)\.([^.]+)\.([^.]+)$
- 分组1:
rest(最后一个-之前的所有内容) - 分组2:
operation(最后一个-到倒数第二个.之间的内容) - 分组3:
trans(倒数第二个.到最后一个.之间的内容) - 分组4:
type(最后一个.之后的内容)
示例代码(Python):
import re file_names = [ "dimitri.weqn_good-read.sky.txt", "yuan.tagine_sold-v1-write.ground.pdf" ] pattern = r"^(.*)-([^-.]+)\.([^.]+)\.([^.]+)$" for file in file_names: match = re.match(pattern, file) if match: rest = match.group(1) operation = match.group(2) trans = match.group(3) type_ = match.group(4) print(f"{{\ntype = {type_}\ntrans = {trans}\noperation = {operation}\nrest = {rest}\n}}")
方式2:字符串切片操作(以Bash为例)
通过字符串截取定位关键分隔符:
# 处理单个文件名示例 file="yuan.tagine_sold-v1-write.ground.pdf" # 获取type:最后一个.之后的内容 type="${file##*.}" # 移除type后的剩余部分:yuan.tagine_sold-v1-write.ground temp="${file%.*}" # 获取trans:剩余部分最后一个.之后的内容 trans="${temp##*.}" # 移除trans后的剩余部分:yuan.tagine_sold-v1-write temp="${temp%.*}" # 获取operation:剩余部分最后一个-之后的内容 operation="${temp##*-}" # 获取rest:剩余部分最后一个-之前的内容 rest="${temp%-*}" echo "{" echo "type = $type" echo "trans = $trans" echo "operation = $operation" echo "rest = $rest" echo "}"
验证结果
两种方式处理第二个文件名时,都会得到符合预期的rest = yuan.tagine_sold-v1,完美解决多-导致的拆分异常。
内容的提问来源于stack exchange,提问作者Nabob
相关产品推荐
相关产品推荐

