Python新手求助:如何从批量索引文件名中提取目标编号并使用?
解决文件名索引提取问题
嘿,我懂你的困扰!你当前的正则表达式r'\d+'会匹配文件名里第一个出现的数字序列——也就是sample1里的1,但你真正想要的是文件名末尾用来区分文件的那个索引数字(比如sample1_..._1_.txt里的1)对吧?
问题根源
re.search()会从字符串开头开始找第一个符合正则的匹配项,所以它优先找到了sample后面的1,而不是你需要的最后那个索引数字。
解决方案:精准匹配目标数字
我们可以调整正则表达式,专门匹配文件名末尾的_数字_.txt格式,这样就能精准捕获到目标索引:
import re import os def get_numbers_from_filename(filename): # 正则匹配:下划线 + 数字序列 + 下划线 + .txt(字符串结尾) match = re.search(r'_(\d+)_\.txt$', filename) if match: return match.group(1) # 返回捕获的数字 return None # 处理不符合格式的文件,避免报错 # 遍历文件夹并提取数字 for filename in os.listdir('input/'): index_num = get_numbers_from_filename(filename) if index_num: print(index_num)
正则表达式说明
_:匹配文件名里的下划线(\d+):捕获一个或多个数字(这就是我们要的索引)_\.txt$:匹配下划线 + 点(转义后的.)+txt,并且$表示必须是字符串结尾,确保我们匹配的是最后那部分
备选方案:字符串分割(依赖固定格式)
如果你的文件名格式永远是前缀_..._索引_.txt,也可以用字符串分割的方式提取:
import os def get_numbers_from_filename(filename): # 按下划线分割文件名 parts = filename.split('_') # 观察格式:分割后倒数第三个元素就是索引数字(比如['sample1', ..., '1', '', 'txt']) if len(parts) >= 3: return parts[-3] return None for filename in os.listdir('input/'): index_num = get_numbers_from_filename(filename) if index_num: print(index_num)
这个方法更简单,但缺点是如果文件名格式有变化(比如下划线数量改变)就会失效,正则的方法更健壮。
内容的提问来源于stack exchange,提问作者Cashoo
相关产品推荐
相关产品推荐

