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

时间:2015-10-23 14:32:20

标签: python regex

作为输入,我有一个文件名(例如" bla150420.txt"),其中包含特定格式的日期。我需要查看给定的文件夹(包含许多文件)并找到我的文件的最新版本。 (而且我必须自动执行此操作 - 对于不同文件夹中的不同文件,这种情况很多次。) 示例目录(dirname):

  • ...
  • bla150420.txt
  • bla150425.txt
  • bla150510.txt

示例输出:

  • bla150510.txt

我该怎么办?我最初的方法是解析文件名中的日期,用RE模式替换日期,并在所有文件名列表中搜索此模式。这似乎不起作用。任何的想法?还是不同的方法?

long long

这对我来说很奇怪,我的程序适用于pattern2,但不适用于pattern1。如果我打印这两个(使用.pattern),如果我将它与' =='进行比较,它看起来是相同的结果。它返回False。我不知道是因为编码/空格/其他什么,也不知道如何找到差异。你能帮忙吗?

1 个答案:

答案 0 :(得分:0)

我认为您只是以自动方式生成工作正则表达式时遇到问题。

Serge指出,你所提供的代码应该因为你的日期似乎有6位数而不是8位而被绊倒,但是第一个正则表达式需要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'