如何提取文件名开头的字母数字混合编号(适配下划线与连字符分隔场景)
提取文件名开头的字母数字编号方案
嘿,这个需求我之前处理批量文件重命名时刚好碰到过,分享几个靠谱的解决方法给你:
方法1:正则表达式(最推荐)
正则是处理这类模式匹配最直接高效的方式,我们可以写一个精准的规则,匹配文件名开头的所有字母数字字符,直到遇到第一个下划线_或者连字符-为止。
正则规则说明
^[A-Za-z0-9]+(?=[_-])
^:锁定字符串起始位置,确保只从文件名开头开始匹配[A-Za-z0-9]+:匹配一个或多个字母/数字,完美对应你的编号格式(?=[_-]):正向预查,保证匹配的字符后面紧跟着下划线或连字符,但不会把分隔符包含在最终结果里
Python 示例代码
import re def get_filename_prefix(filename): # 匹配开头的字母数字编号 match_result = re.match(r'^[A-Za-z0-9]+(?=[_-])', filename) # 匹配成功返回编号,否则返回None(可根据需求调整默认值) return match_result.group(0) if match_result else None # 测试你的示例文件名 print(get_filename_prefix("12345V001_Test1-Test2-Test3.jpg")) # 输出: 12345V001 print(get_filename_prefix("12345V001-Test1_Test2-Test3.jpg")) # 输出: 12345V001
方法2:字符串分割法
如果你对正则不太熟悉,也可以通过定位第一个分隔符的位置来截取前缀:
Python 示例代码
def extract_prefix_via_split(filename): # 获取下划线和连字符的位置 underscore_pos = filename.find('_') dash_pos = filename.find('-') # 收集有效分隔符的位置 split_positions = [] if underscore_pos != -1: split_positions.append(underscore_pos) if dash_pos != -1: split_positions.append(dash_pos) if split_positions: first_split_pos = min(split_positions) return filename[:first_split_pos] # 没有找到分隔符时的返回值,可根据需求修改 return None # 测试 print(extract_prefix_via_split("12345V001_Test1-Test2-Test3.jpg")) # 输出: 12345V001 print(extract_prefix_via_split("12345V001-Test1_Test2-Test3.jpg")) # 输出: 12345V001
两种方法对比
- 正则法更简洁健壮,后续如果文件名格式有微小调整(比如分隔符前后出现空格),修改正则规则即可适配
- 分割法更直观易懂,适合对正则不太熟悉的开发者,代码可读性更高
内容的提问来源于stack exchange,提问作者Scamus
相关产品推荐
相关产品推荐

