如何在Python中精准匹配文件名中的独立指定数字字符串?
匹配文件名中的独立数字
我有一个文件夹,其中每个文件均以数字命名(如img 1、img 2、img-3、4-img等)。需要根据精确的字符串获取文件,例如输入'4'时,仅返回包含**独立'4'**的文件,而非包含'14'或'40'的文件。目前程序会返回所有包含目标字符串的文件,且数字在文件名中的位置不固定(有的在末尾,有的在中间)。
示例
文件夹文件列表:
['ep 4', 'xxx 3 ', 'img4', '4xxx', 'ep-40', 'file.mp4', 'file 4.mp4', 'ep.4.', 'ep.4 ', 'ep. 4. ', 'ep4xxx', 'ep 4 ', '404ep']
期望返回的MP4文件(仅包含独立数字4):
['ep 4', 'img4', '4xxx','file 4.mp4','ep.4.','ep.4 ', 'ep. 4. ', 'ep4xxx','ep 4 ', '404ep']
当前代码
import os source_folder = "你的文件夹路径" for (root, dirs, file) in os.walk(source_folder): for f in file: if '.mp4' and ('4') in f: print(f)
尝试用==替代in,仍未解决问题。
解决方案
要匹配独立的数字4,核心是确保4的前后不是其他数字。可以用正则表达式来实现:
方法1:使用单词边界\b
\b匹配单词字符(字母、数字、下划线)与非单词字符的边界,能精准定位独立的4:
- 4在开头且前无数字(如
4xxx) - 4在结尾且后无数字(如
ep 4) - 4在中间且前后非数字(如
ep.4.)
修改后的代码:
import os import re target_num = '4' source_folder = "你的文件夹路径" # 构建正则:匹配独立的目标数字 pattern = re.compile(rf'\b{target_num}\b') for root, dirs, files in os.walk(source_folder): for f in files: # 先判断是MP4文件,再检查是否包含独立数字 if f.endswith('.mp4') and pattern.search(f): print(f)
方法2:使用负向断言(适配下划线场景)
如果文件名存在下划线(如ep_4),\b会将下划线视为单词字符,此时用负向断言确保4的前后不是数字:
import os import re target_num = '4' source_folder = "你的文件夹路径" # 正则含义:4的前面是字符串开头/非数字,后面是字符串结尾/非数字 pattern = re.compile(rf'(?:^|\D){target_num}(?:\D|$)') for root, dirs, files in os.walk(source_folder): for f in files: if f.endswith('.mp4') and pattern.search(f): print(f)
问题说明
原代码的if '.mp4' and ('4') in f逻辑错误:'.mp4'是恒为True的布尔值,等同于只判断'4' in f,所以会返回所有包含4的MP4文件,不管是不是独立的。用==完全不符合需求,因为它是判断文件名完全等于'4'。
内容的提问来源于stack exchange,提问作者bull11trc
相关产品推荐
相关产品推荐

