【问题标题】:How to use regex with glob library如何将正则表达式与 glob 库一起使用
【发布时间】:2017-01-30 00:54:30
【问题描述】:

我有一个文件夹,其中包含许多用于 D3 可视化的输入文件。但是,我无法让我的正则表达式代码与 glob 一起使用。这允许用户指定年份(注意:我所有的输入文件都有格式 YYYY_MM_#produpdt###):

from glob import glob

years = "[\'2016\']"
months = "[\'12\']"
loc = "produpdt_files/"
file_list = []
for year in years:
    file_list.extend(glob(loc+year+"*"))
print file_list

我应该如何编写代码以使用年和月?以下方法不起作用:

from glob import glob

years = "[\'2016\']"
months = "[\'12\']"
loc = "produpdt_files/"
file_list = []
for year in years:
    for month in months:
        print(loc+year+"_12"+"*")
        file_list.extend(glob(loc+year+"_"+month+"*"))
print file_list

【问题讨论】:

  • 附带说明,years 是一个字符串。当您遍历一个字符串 (for year in years) 时,您一次将获得一个字符。我假设你并不是真的要那样做。同样的评论适用于您在 months 上的循环。
  • 谢谢!这对我所看到的来说是有道理的。
  • 文件名、数字中的那些哈希是什么?
  • 是的,它们是数字。

标签: python regex glob


【解决方案1】:

您要输入 glob 的表达式是 os.path.join(loc, "2016_12_*")

【讨论】:

  • 有没有办法在该表达式中使用变量“年”和“月”?我刚试过 os.path.join(loc, year+"12*") 失败了。
  • os.path.join(loc, year+"12*")os.path.join(loc, "2016_12_*") 不等价。 year+"12*" 评估(使用year=2016)为201612*。请注意,这在年份和月份之间没有下划线。创建字符串的pythonic方法是使用字符串格式,所以os.path.join(loc, "{year}_{month}_*".format(year=2016, month=12))是你想要的。
  • 感谢 Terrence 以 Python 方式创建字符串!而且我无法在 StackOverflow 中显示下划线——我可能必须添加一个转义字符。
  • 那你还有问题吗?
  • 不,你们解决了。我使用了以下代码:file_list.extend(glob(os.path.join(loc, year+""+month+"*")))
【解决方案2】:

glob 不接受正则表达式,因此您需要编写自己的 globber。但是使用os.listdir 很容易做到这一点。您可以使用正则表达式中的组来查找多个日期,例如r"(2012|2013|2014)_(10|11)_\dproduptd\d{4}"。下面的示例使用年份和月份列表格式化正则表达式。

import os
import re

def produpdt_glob(path, years=None, months=None):
    if years is None:
        years = r'\d' * 4
    if months is None:
        months = r'[01]\d'
    regex = r'({})_({})_\dprodupdt\d{4}'.format('|'.join(years), '|'.join(months))
    match = re.compile(regex).match
    for fn in os.listdir(path):
        if match(fn):
            fn = os.path.join(path, fn)
            if os.path.isfile(fn):
                yield fn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2016-12-29
    • 2011-06-19
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多