繁体   English   中英

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

[英]How to automatically create a python re pattern from a file name?

作为输入,我有一个文件名(例如“ 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的复杂性,但建议不要使用函数来简化regex的生成:

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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM