我有一个文件夹,其中每个文件都以数字命名(例如img 1、img 2、img-3、4-img等)。我希望按 exact 字符串获取文件(所以如果我输入“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']
,而我只需要文件中的文件数正好是4
,那么我只需要返回['ep 4', 'img4', '4xxx','file 4.mp4','ep.4.','ep.4 ', 'ep. 4. ',ep4xxx,'ep 4 ','404ep]
下面是我所拥有(在本例中,我只想返回所有mp4文件类型)
for (root, dirs, file) in os.walk(source_folder):
for f in file:
if '.mp4' and ('4') in f:
print(f)
已尝试==
而不是in
3条答案
按热度按时间58wvjzkj1#
根据您的输入判断,所需的正则表达式需要满足以下条件:
1.与提供的数字完全匹配
1.忽略文件扩展名中的数字匹配项(如果存在)
1.处理包含空格的文件名
我认为这将满足所有这些要求:
用法:
请注意,这个解决方案涉及到创建一个Pattern对象,并使用该对象检查每个文件。与直接使用模式和文件名调用
re.fullmatch
相比,这个策略提供了性能优势,因为不必为每个调用编译模式。这种解决方案有一个缺点:它假设文件名的格式为
name.extension
,并且您要搜索的值位于name
部分。由于正则表达式的贪婪特性,如果您允许文件名包含.
,则无法从搜索中排除扩展名。因此,修改此表达式以匹配ep.4
也会导致它匹配file.mp4
。也就是说,有一种解决方法,即在进行匹配之前从文件名中去除扩展名:请注意,此解决方案现在在匹配条件中包括
.
,并且不排除扩展名。相反,它依赖于预处理(strip_extension
函数)在匹配之前从文件名中删除任何文件扩展名。作为补充,有时候你会得到带有前缀为零的文件(例如004、0001等)。你可以修改正则表达式来处理这种情况:
nxowjjhe2#
我们可以使用
re.search
沿着正则表达式选项的列表解析:xpszyzbs3#
这可以通过以下函数来实现