匹配字符串中间的文件名

2024-06-28 20:01:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个目录,其文件格式如下:LnLnnnnLnnn.txt

其中L=字母,n=数字。E、 g:p2c0789c001.txt

我想根据第二个数字(即0789)是奇数还是偶数来分隔这些文件。在

只有在第二个数字在0001-0009之间时,我才能使用代码:

odd_files = []
for root, dirs, filenames in os.walk('.'):
   for filename in fnmatch.filter(filenames, 'p2c000[13579]*.txt'):
       odd_files.append(os.path.join(root, filename))

这将返回文件:['./p2c0001c054.txt', './p2c0003c055.txt', './p2c0005c056.txt', './p2c0007c057.txt', './p2c0009c058.txt']

有什么建议,我如何才能使这对任何给定的四位数有效?在


Tags: 文件in目录txtforos字母数字
3条回答

最简单的解决方案是扩展通配符以匹配更广泛的内容。在

为此,我可能会做一些类似的事情:

for filename in fnmatch.filter(filenames, '??????[13579]*.txt'):

这将匹配值之前的任何字符,它将匹配通配符类中的任何奇数值,然后它将接受任何匹配的内容。在

这有点恶心,因为它是aaaaaaaaa3alkjf达尔克JFSHGLKJZSDHFGS.txt会匹配的,这是超级恶心。如果您知道您正在遍历的目录中的数据得到了很好的控制,那就可以了。一个更好的解决方案可能是多指定一些东西。这可以通过以下表达式实现:

^{pr2}$

在fnmatch.filter方法使用Unix样式通配符。这意味着您可以使用以下选项:

是吗?-匹配任何单个字符 *-匹配任何东西,从无到有 []—这与一类事物相匹配,使用-表示范围和!排除

这样行吗?在

import re
regex = re.compile("[a-z][0-9][a-z]([0-9]{4})[a-z][0-9]{3}.txt")
filter(lambda x: int(regex.match(x).groups()[0]) % 2 == 1, fnmatch)

如果有点麻烦,您可以将其转换为生成器并手动编写测试代码:

def odd_files_generator():
    for root, dirs, filenames in os.walk('.'):
        for filename in filenames:
            if filename[6] in '13579':
                yield filename

odd_files = list(odd_files_generator)

如果您的测试变得非常难以简洁地表达,请用显式的测试代码替换if filename ...行。在

相关问题 更多 >