能否从文件名one_two_three_four_five.rtf按规则提取字符串至A/B/C变量?
可行性分析与实现方案
当然可行!这种从后往前拆分文件名的需求在日常开发里挺常见的,完全能按照你说的“从最后一个字符开始读取”的逻辑实现。咱们一步步拆解:
核心思路
首先得把文件名的后缀(.rtf)剥离出来,只处理one_two_three_four_five这部分内容。然后通过定位倒数第一个和倒数第二个下划线的位置,就能精准拆分出你要的三个变量。
具体实现(以Python为例)
不管是用语言自带的反向查找方法,还是真的从最后一个字符开始逐个遍历,都能搞定。这里给两种思路的代码:
方法1:利用反向查找快速定位(高效简洁)
filename = "one_two_three_four_five.rtf" # 第一步:剥离文件后缀,得到纯名称部分 name_core = filename.rsplit('.', 1)[0] # 结果:"one_two_three_four_five" # 第二步:找到所有下划线的位置,取倒数两个 all_underscore_indices = [idx for idx, char in enumerate(name_core) if char == '_'] last_underscore = all_underscore_indices[-1] second_last_underscore = all_underscore_indices[-2] # 第三步:拆分出三个变量 A = name_core[last_underscore + 1:] # 末尾的"five" B = name_core[second_last_underscore + 1 : last_underscore] # 倒数第二段的"four" C = name_core[:second_last_underscore] # 倒数第二个下划线前的所有内容:"one_two_three" print(f"A: {A}, B: {B}, C: {C}")
方法2:严格从最后一个字符开始遍历(贴合你的读取方向要求)
如果一定要完全遵循“从最后一个字符开始读取”的逻辑,咱们可以逐个字符反向遍历:
filename = "one_two_three_four_five.rtf" name_core = filename.rsplit('.', 1)[0] # 提取A:从最后一个字符开始,直到遇到第一个下划线 A_chars = [] for char in reversed(name_core): if char == '_': break A_chars.append(char) A = ''.join(reversed(A_chars)) # 反转回来得到"five" # 提取B:跳过刚才的下划线,继续反向遍历直到下一个下划线 remaining_after_A = name_core[:-len(A)-1] # 去掉A和前面的下划线 B_chars = [] for char in reversed(remaining_after_A): if char == '_': break B_chars.append(char) B = ''.join(reversed(B_chars)) # 反转回来得到"four" # 提取C:剩下的所有内容就是倒数第二个下划线前的部分 C = remaining_after_A[:-len(B)-1] print(f"A: {A}, B: {B}, C: {C}")
总结
两种方法都能完美实现你的需求,核心就是通过反向定位下划线的位置来拆分字符串。不管你的文件名前面有多少个下划线,只要确保至少有两个下划线(能拆分出A、B、C三部分),这个逻辑就稳定有效。
内容的提问来源于stack exchange,提问作者Arun GoWdA
相关产品推荐
相关产品推荐

