正则表达式和Python glob
我有一个文件夹,里面有12500张图片。文件名包含数字,因此看起来像:正则表达式和Python glob,python,regex,glob,Python,Regex,Glob,我有一个文件夹,里面有12500张图片。文件名包含数字,因此看起来像: 0.jpg 1.jpg 2.jpg 3.jpg . . .12499.jpg 现在我想移动文件。范围为0-7999的文件应复制到第一个文件夹。文件8000-9999应复制到第二个文件夹,范围10000-12499的文件应复制到第三个文件夹 首先,我认为我可以轻松地将[0-7999].jpg用于第一个文件夹[8000-9999].jpg用于第二个文件夹[10000-12499].jpg用于第三个文件夹。然而,这是行不通的。根
0.jpg
1.jpg
2.jpg
3.jpg
.
.
.12499.jpg
现在我想移动文件。范围为0-7999的文件应复制到第一个文件夹。文件8000-9999应复制到第二个文件夹,范围10000-12499的文件应复制到第三个文件夹
首先,我认为我可以轻松地将[0-7999].jpg用于第一个文件夹[8000-9999].jpg用于第二个文件夹[10000-12499].jpg用于第三个文件夹。然而,这是行不通的。根据我知道的通配符,我算出了下面的代码?及*:
以下代码确实起作用,也起作用(请注意,我注释掉了shutil.copy,而使用print检查结果):
然而,我希望有一个优雅的解决方案。我在Google上搜索了具有整数范围的正则表达式,并尝试了以下操作:
dest_dir = "/tmp/folder3/"
for file in glob.glob('/tmp/source/\b([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|1000).jpg'):
#shutil.copy(file, dest_dir)
print(file)
这是行不通的。那么,正确的实现是什么样子的呢?我需要两者的解决方案,shutil.copy和shutil.move,但我认为两者都是一样的我需要一个正则表达式来解决这个问题,因为我希望这只是解决这个问题的一行代码。如果你只知道正确的表达式。我不想像这样反复提取数字/值本身(或任何其他避免找到正确正则表达式的解决方案)。所以我的问题实际上是关于正则表达式。glob
regex不支持交替管道符号(|
),就像您使用的那样,最好使用一些regex模式(re
)在一行上创建所需的文件列表,然后在其上迭代。你有3个范围,所以你需要3个循环来完成这个任务!使用您提到的正则表达式的其中一个将如下所示:
import re
import glob
dest_dir = "/tmp/folder3/"
for file in [f for f in glob.glob("/tmp/source/*.jpg") if re.search(r'([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|1000)\.jpg', f)]:
#shutil.copy(file, dest_dir)
print(file)
你不需要正则表达式
for file in glob.glob('/tmp/source/*.jpg'):
fileNum = int(file.split('/')[-1].split('.')[0])
newDir = "/tmp/folder3/"
if fileNum < 8000:
newDir = "/tmp/folder1/"
elif fileNum < 10000:
newDir = "/tmp/folder2/"
#shutil.copy(file, newDir)
print(file)
对于glob.glob('/tmp/source/*.jpg')中的文件:
fileNum=int(file.split('/')[-1]。split('.')[0])
newDir=“/tmp/folder3/”
如果fileNum<8000:
newDir=“/tmp/folder1/”
elif fileNum<10000:
newDir=“/tmp/folder2/”
#复制(文件,newDir)
打印(文件)
你不能在glob中使用regex。谢谢+1,只是问一下,“or”是什么?当我说或时,我指的是你在regex中使用的交替管道符号。
)@statistian
for file in glob.glob('/tmp/source/*.jpg'):
fileNum = int(file.split('/')[-1].split('.')[0])
newDir = "/tmp/folder3/"
if fileNum < 8000:
newDir = "/tmp/folder1/"
elif fileNum < 10000:
newDir = "/tmp/folder2/"
#shutil.copy(file, newDir)
print(file)