【问题标题】:Regular expression and Python glob [duplicate]正则表达式和 Python glob [重复]
【发布时间】:2020-07-12 16:54:07
【问题描述】:

我有一个包含 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 来检查结果):

import glob
import shutil
dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/?.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/??.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/???.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/[1-7]???.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder2/"
for file in glob.glob('/tmp/source/[8-9]???.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

dest_dir = "/tmp/folder3/"
for file in glob.glob('/tmp/source/?????.jpg'):
    #shutil.copy(file, dest_dir)
    print(file)

但是,我想为此提供一个优雅的解决方案。我用整数范围搜索了正则表达式并尝试了以下方法:

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,但我认为两者都是一样的。 我需要在这里有一个正则表达式解决方案,因为我希望这只是解决这个问题的一行代码。如果一个人只知道正确的表达式。我不想通过提取数字/值本身来迭代它,就像在这个solution(或任何其他避免找到正确正则表达式的解决方案)中一样。所以我的问题真的是关于正则表达式。

【问题讨论】:

  • 你不能在全局中使用正则表达式。

标签: python regex glob


【解决方案1】:

glob 正则表达式不支持交替管道符号(|),就像您使用的那样,最好使用一些正则表达式模式(re)在一行上创建所需的文件列表,然后对其进行迭代.你有 3 个范围,所以你需要 3 个 for 循环来做到这一点!其中一个使用您提到的正则表达式将如下:

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)

【讨论】:

  • 谢谢 +1,请问什么是“或”?
  • 当我说 or 我的意思是交替管道符号 | 你在正则表达式中使用 :) @StatTistician
【解决方案2】:

你不需要正则表达式。

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)

【讨论】:

    猜你喜欢
    • 2017-04-24
    • 2016-04-22
    • 2018-03-16
    • 2010-10-01
    • 2016-11-16
    • 2016-07-22
    • 1970-01-01
    • 2013-05-19
    • 2012-07-13
    相关资源
    最近更新 更多