【问题标题】:how to get file name using regular expression in python如何在python中使用正则表达式获取文件名
【发布时间】:2021-03-09 06:12:47
【问题描述】:

我有一个 Python 脚本,列出了给定路径中的文件夹和文件,我想找到一个以数字和当前日期开头的 pdf 文件。为此,我使用了正则表达式,但问题是系统与请求的文件不匹配。

regular expression = [0-9]+_[0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2}$

文件名示例:10204_09-03-2021.pdf

我的代码中的错误在哪里?

代码:

for file in files:
   if file.endwith("pdf"):
      if file == re.findall("^[0-9]+_[0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2}$",file)
         shutil.copy(filename,destination)

【问题讨论】:

  • $ 表示匹配必须在行尾结束。 .pdf 呢?以\.pdf$ 结尾。
  • 将 .pdf 添加到正则表达式的末尾
  • 我试过你的评论,但还是没找到
  • 可能是因为你在做file == re.findall(...)。 File 是一个字符串,在这种情况下 re.findall() 将返回一个列表。
  • 什么是filename?这里不应该是file吗?

标签: python regex shutil


【解决方案1】:

当您的文件名为10204_09-03-2021.pdf。您的正则表达式模式不会匹配它,因为它应该以 [0-9]{2}$ 结尾,因为 $.但是你的文件名是 10204_09-03-2021.pdf,所以它总是以 .pdf 结尾。

在和[0-9]{2}$ 之间添加一个.pdf 将匹配它。例如 -

>>> import re
>>> file = "10204_09-03-2021.pdf"
>>> pattern = re.compile(r"[0-9]+_[0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2}\.pdf$")
>>> pattern.findall(file)
['10204_09-03-2021.pdf']

还要注意file == re.findall(...) 中的文件是一个字符串,而 re.findall(...) 是一个列表。因此,即使匹配,您也会得到 False 。您可以尝试使用re.fullmatch,它返回Match Object(其中布尔值始终为True)或None(如果不匹配)。或者,你可以file in re.findall(...)

【讨论】:

  • 仍然没有找到请求的文件
  • 是你的文件名不匹配还是其他原因?因为这种模式应该。
【解决方案2】:

你可以使用

import os, re, shutil
destination = r'new/folder/path'
files = ['folder/10204_09-03-2021.pdf', 'folder/04_09-03-2021.pdf']
rx = re.compile(r'^[0-9]+_[0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2}\.pdf$', re.I)
for file in files:
    if rx.match(os.path.basename(file)):
        #shutil.copy(filename,destination)
        print(file) # Just print here
# => folder/10204_09-03-2021.pdf, folder/04_09-03-2021.pdf

请参阅Python demoregex demo

注意:正则表达式仅应用于文件路径的基本名称(文件名本身,带有扩展名)。因此,\.pdf 被添加到正则表达式模式中,^/$ 锚确保整个字符串必须与正则表达式匹配。在此处使用 re.match 会产生与 re.searchre.fullmatch 相同的结果。

正则表达式详细信息

  • ^ - 字符串开头
  • [0-9]+ - 一位或多位数字
  • _ - 一个 _ 字符
  • [0-3]?[0-9] - 从03 的可选数字,然后是任意一位数字
  • - - 一个连字符
  • [0-3]?[0-9]- - 从 03 的可选数字,然后是任意一位数字,然后是连字符
  • (?:[0-9]{2})? - 可选的两位数序列
  • [0-9]{2} - 两位数
  • \.pdf - .pdf 字符串
  • $ - 字符串结束。

由于re.I 标志,正则表达式不区分大小写。

【讨论】:

    猜你喜欢
    • 2012-10-21
    • 1970-01-01
    • 2021-08-12
    • 2015-06-08
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多