当前位置:嗨网首页>书籍在线阅读

13-第1步_为美国风格的日期创建一个正则表达式

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

第1步:为美国风格的日期创建一个正则表达式

程序的第一部分需要导入必要的模块,并创建一个正则表达式,它能识别MM-DD-YYYY格式的日期。TODO注释将提醒你这个程序还要写什么。将它们作为TODO,就很容易利用IDLE的Ctrl-F快捷键查找功能来找到它们。让你的代码看起来像这样:

  #! python3
  # renameDates.py - Renames filenames with American MM-DD-YYYY date format
  # to European DD-MM-YYYY.
❶ import shutil, os, re
  # Create a regex that matches files with the American date format.
❷ datePattern =  re.compile(r"""^(.*?) #  all text before the date
      ((0|1)?\d)-                      # one or two digits for the month
      ((0|1|2|3)?\d)-                  # one or two digits for the day
      ((19|20)\d\d)                    # four digits for the year
      (.*?)$                           #  all  text  after  the  date
      """, re.VERBOSE❸)
  # TODO: Loop over the files in the working directory.
  # TODO: Skip files without a date.
  # TODO: Get the different parts of the filename.
  #  TODO:  Form  the  European-style  filename.
  # TODO: Get the full, absolute file paths.
  # TODO: Rename the files.

通过本章,你知道 shutil.move() 函数可以用于文件重命名:它的参数是要重命名的文件名以及新的文件名。因为这个函数存在于 shutil 模块中,所以你必须导入该模块❶。

在为这些文件重命名之前,需要确定哪些文件要重命名。文件名如果包含spam4-4-1984.txt和01-03-2014eggs.zip这样的日期,就应该重命名;而不包含日期的文件名应该被忽略,如littlebrother.epub。

可以用正则表达式来识别该模式。在开始导入 re 模块后,调用 re.compile() 创建一个 Regex 对象❷。传入 re.VERBOSE 作为第二个参数❸,这将在正则表达式字符串中允许空白字符和注释,让它更具可读性。

正则表达式字符串以 ^(.*?) 开始,匹配文件名开始处、日期出现之前的任何文本。 ((0|1)?\d) 分组匹配月份。第一个数字可以是0或1,所以正则表达式会匹配12,作为十二月份;也会匹配02,作为二月份。这个数字是可选的,所以四月份可以是04或4。日期的分组是 ((0|1|2|3)?\d) ,它遵循类似的逻辑。3、03和31是有效的日期数字(是的,这个正则表达式会接受一些无效的日期,如 4-31-20142-29-20130-15-2014 。日期有许多特例,很容易被遗漏。为了简单,这个程序中的正则表达式做得已经足够好了)。

虽然1885是一个有效的年份,但你可能只想寻找20世纪和21世纪的年份。 ((19|20)\d\d) 防止了程序不小心匹配非日期的文件名,它们和日期格式类似,如10-10-1000.txt。

正则表达式的 (.*?)$ 部分将匹配日期之后的任何文本。