正则表达式和Python glob

正则表达式和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用于第三个文件夹。然而,这是行不通的。根

我有一个文件夹,里面有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用于第三个文件夹。然而,这是行不通的。根据我知道的通配符,我算出了下面的代码?及*: 以下代码确实起作用,也起作用(请注意,我注释掉了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)