使用fnmatch进行文件名匹配

1 投票
3 回答
2037 浏览
提问于 2025-04-18 15:05

我有一个文件夹,里面有一些文件,文件名的格式是:LnLnnnnLnnn.txt

这里的L代表字母,n代表数字。比如说:p2c0789c001.txt

我想根据第二个数字(也就是0789)是否在某个数字范围内(比如从0001到0146)来把这些文件分开。

请问用fnmatch能简单做到这一点吗?还是说我应该用正则表达式(regex)?

这是我目前写的代码:

out_files = []
for root, dirs, filenames in os.walk('.'):
   for filename in fnmatch.filter(filenames, '???[0-9][0-9][0-9][0-9]????*.txt'):
       out_files.append(os.path.join(root, filename))

3 个回答

1

如果字符串开头还有其他的c,或者在数字之前的字符串长度发生变化,可以这样写:

if 1 <= int(re.findall(r"c([0-9]+)c", s)[0]) <= 487:

或者如果数字总是有四位:

if 1 <= int(re.findall(r"c(\d{4})c", s)[0]) <= 487:
1

编辑: 哎呀,忘记加一个额外的循环了。另外,看看这样性能是否更好。

编辑2: 如果第一个字母是c的话,会检查倒数第二个元素,这样根据两种选择的标准,这个元素是一定存在的。

out_files = []
for root, dirs, filenames in os.walk('.'):
    for filename in filesnames:
        try:
            if  1 <= int(filename.split('c')[-2]) <= 146:
                out_files.append(...)
        except IndexError:
            continue

另外,可以使用生成器:

out_files = []
for root, dirs, filenames in os.walk('.'):
    for filename in (name for name in filenames if 'c' in name):
        if  1 <= int(filename.split('c')[-2]) <= 146:
            out_files.append(...)
1

fnmatch.filter() 里面你不能轻松做到这一点,但你可以自己来实现:

out_files = []
for root, dirs, filenames in os.walk('.'):
   for filename in fnmatch.filter(filenames, '???[0-9][0-9][0-9][0-9]????*.txt'):
       if(1 <= int(filename[3:7]) <= 146):
           out_files.append(os.path.join(root, filename))

或者,如果你喜欢用列表推导式的话:

import os
import fnmatch
out_files = [os.path.join(root, filename)
             for root, dirs, filenames in os.walk('.')
             for filename in fnmatch.filter(filenames,
                                            '???[0-9][0-9][0-9][0-9]????*.txt')
             if 1 <= int(filename[3:7]) <= 146]

撰写回答