Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从文件名自动创建python重模式?_Python_Regex - Fatal编程技术网

如何从文件名自动创建python重模式?

如何从文件名自动创建python重模式?,python,regex,Python,Regex,作为输入,我有一个文件名(例如“bla150420.txt”),其中包含一个特定格式的日期。我需要查看一个给定的文件夹(包含许多文件),并找到我的文件的最新版本。(我必须自动完成这项工作——多次针对不同文件夹中的不同文件。) 示例目录(目录名): bla150420.txt bla150425.txt bla150510.txt 示例输出: bla150510.txt 我怎样才能做到?我最初的方法是从文件名中解析一个日期,用RE模式替换该日期,并在所有文件名列表中搜索该模式。这似乎不起

作为输入,我有一个文件名(例如“bla150420.txt”),其中包含一个特定格式的日期。我需要查看一个给定的文件夹(包含许多文件),并找到我的文件的最新版本。(我必须自动完成这项工作——多次针对不同文件夹中的不同文件。) 示例目录(目录名):

  • bla150420.txt
  • bla150425.txt
  • bla150510.txt
示例输出:

  • bla150510.txt
我怎样才能做到?我最初的方法是从文件名中解析一个日期,用RE模式替换该日期,并在所有文件名列表中搜索该模式。这似乎不起作用。有什么想法吗?还是不同的方法

    def get_date(file_name):
        DATE_RE = re.compile('([0-9]{6})')    #EDITED - TYPO
        try:
            match = DATE_RE.search(fname).group()
        except AttributeError:
            sys.stderr.write('ERROR! No date matches string!\n\t' + match)
        else:
            date = datetime.datetime.strptime(match, '%Y%m%d')
            return match, date

    date_string, current_date = get_date(fname)
    # fname is a given file name (e.g. bla150420.txt)

    pattern1 = re.compile(re.sub(date_string, '(.*)', fname))
    # pattern1 returns value 'kds_docs-(.*).zip'

    pattern2 = re.compile('kds_docs-(.*).zip')

    if os.path.isdir(dirname):
        matching_files = [x for x in os.listdir(dirname) 
                          if pattern1.search(x)]

这对我来说是一个奇迹,我的程序可以使用pattern2,但不能使用pattern1。如果我打印这两个(使用.pattern),它看起来像是相同的结果,如果我将其与“==”进行比较,它将返回False。我不知道这是否是因为编码/空白/其他原因,也不知道如何找到差异。您能帮忙吗?

我认为您只是在以自动化方式生成一个工作正则表达式方面遇到了问题

Serge指出,你的代码应该会因为你的日期似乎是6位数而不是8位数而被绊倒,但是第一个正则表达式需要8位数——如果它不仅仅是一个拼写错误,请更正或解释

我想您正在寻找验证任何数字串是否确实是日期,但这似乎没有必要,因为文件名可能有一个数字串,可以解析为日期,但不是您要查找的日期-不理想。如果一定要约会,请告诉我

我不熟悉Python的复杂性,但我建议通过不使用函数来简化正则表达式的生成:

pattern1 = re.compile(re.sub('([0-9]{6})', '(.*)', fname))
直接更换就行了。我想说,像这样再往前走一点可能会更安全:

pattern1 = re.compile(re.sub('([0-9]{6})', '(\d{6})', fname))
…如果有任何其他可能的限制,您可以进一步限制6位数的匹配。例如,6位字符串可能始终位于文件名的末尾,就在扩展名之前:

pattern1 = re.compile(re.sub('([0-9]{6})(?=\..*$)', '(\d{6})', fname))
# should turn 'kds_docs-120501-151023.zip' into 'kds_docs-150510-(\d{6}).zip'

你真的需要正则表达式吗?似乎您只需要
max(文件名,key=lambda文件名:datetime.datetime.strtime(文件名[3:-4],“%Y%m%d”)
(即“将
bla
.txt
之间的所有内容转换为日期,并给出其中最大的一个)。这是打字错误吗?您的文件名示例是
bla150420.txt
(注意6位数字),当您的正则表达式需要8(
'([0-9]{8})
)?@jornsharpe时,当前的愿望似乎是查找与提供的文件名匹配的所有文件(日期除外)。如果提供了
bla150420.txt
,则生成的正则表达式应该匹配以
bla
开头并以
.txt
@CodeJockey结尾的任何内容,但他们希望得到具有最新日期的正则表达式,如果其中一些正则表达式没有date@CodeJockey那么这还不清楚你在问什么,我会等着看(如果有)OP增加的其他内容。