正则表达式在数字范围内找到匹配项

时间:2020-08-07 19:15:40

标签: python regex string

我有一系列文件具有以下命名约定...“ 2020.01.01 W1 Forecast.xlsm”。我正在尝试遍历目录,同时搜索与2020年及更大或更广泛的范围(即2020-2030年)匹配的文件标题模式,因此我不必每年都更改脚本。我已经尝试了以下方法,但未能使模式匹配当前年份2020年以外的任何其他内容。命名约定以年份字符串开头。

path_str = '/Users/X/Desktop/Test_Directory/'

pattern_str = '*2020.*Forecast.xlsm'

p = Path(path_str)
files = p.rglob(pattern_str)

for file in files:
    print(file)

示例输出:

/Users/X/Desktop/Test_Directory/2020.08.03 Week 32 Forecast.xlsm
/Users/X/Desktop/Test_Directory/2020.01.06 Week 2 Forecast.xlsm
/Users/X/Desktop/Test_Directory/2020.06.18 Week 25 Forecast.xlsm
/Users/X/Desktop/Test_Directory/2020.06.22 Week 26 Forecast.xlsm

非常感谢您的帮助或指导。

3 个答案:

答案 0 :(得分:1)

您正在寻找的是:'^20[2-9][0-9].+(\.xlsm)$'

它表示从2020到2099,然后是任意字符.一次或多次+,最后是xlsm (\.xlsm)$。请注意最后一部分中的反斜杠。必须先跳过句号,否则它将以任何字符的形式中断。

答案 1 :(得分:0)

我不确定您想走多远,但是,如果您的目标只是确定2020-2030年之间的年份,那么这是您完整路径的常规表达式:^.*20(2\d|30).*$。 / p>

由于您正在使用路径,因此建议您在列表的最后一项上使用正则表达式之前,在最后一个斜杠/上分割字符串。比起您可以为文件名指定正则表达式。

也许这会有所帮助:

import re
for file in files:
    my_string = file.split('/')[-1]
    match = re.find('^20(2\d|30).*\.xml$', my_string)
    if match:
        print(file)

也许可以尝试使用此tool

我还想添加一些有关正则表达式的信息,以便您了解发生了什么。

  1. ^-这将查找字符串的开头。到目前为止,某些答案未成功的原因。

  2. .-查找任何符号。因此,您可以轻松克服一些无用的部分。但请注意,因此,您必须指定一个像这样的点\.

  3. $-这表示字符串的结尾。

  4. \d-这是digit的同义词,与[0-9]

    匹配
  5. *-这是贪婪的符号。这会尝试从零到所需类型的尽可能多的项目匹配。例子:

    a。 .*-尝试查找尽可能多的符号,没有类型定义。

    b。 \d*-这会尝试查找尽可能多的数字。

  6. +-这也是一个贪婪的符号,但必须至少匹配一次。

答案 2 :(得分:0)

在第二种模式中,您可能想在年后丢失.通配符

^(202[0-9]|2030).*Forecast\.xlsm

而不是

^(202[0-9]|2030)*Forecast.xlsm

您可以使用https://regexr.com/之类的网站来测试正则表达式。

但是您可能要考虑使用编程逻辑而不是正则表达式来获取最新文件,因此可以解析文件名并选择日期范围,例如使用datetime


更新

从更新的代码开始:

import datetime
path_str = '/Users/X/Desktop/Test_Directory/'
pattern_str = '*Forecast.xlsm'  # All your report files

p = Path(path_str)
files = p.rglob(pattern_str)

for file in files:
    # # uncomment in case there are different patterns in that folder:
    # if not re.match(r"\d{4}\.\d{2}.\d{2}.*", file.name): continue
    date = datetime.datetime.strptime(file.name[:10], "%Y.%m.%d")
    current_year = datetime.datetime.today().year
    if date > datetime.datetime(current_year, 1, 1):
        print(date)

这将过滤文件列表中的当年名称。

相关问题