【问题标题】:how to find the required pattern for a file using regex in python?如何在 python 中使用正则表达式查找文件所需的模式?
【发布时间】:2021-11-10 09:45:07
【问题描述】:

我试图匹配我文件夹中文件的模式,文件扩展名为 pdf

我有许多 pdf 文件,它们具有相同的模式但最后名称不同。

模式包括日期 + 文件名。

问题在于,当我运行脚本时,系统将两个文件名都视为第一个模式 (python_pt),而不是使用 elif 语句。

例子:

  • 10-11-2021 python.pdf
  • 22-09-2021 java.pdf

代码:

import re 
import  os 
from os import path 
from tqdm import tqdm
from time import sleep 

python_pt= "^[0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2}$ python.pdf"
java_pt1= "^[0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2}$ java.pdf"
java_pt2= "^ java [0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2}$.pdf"
str = 'c:'
a = 0
i = 0
for dirpath, dirnames, files in os.walk(src, topdown=True):         
    print(f'\nFound directory: {dirpath}\n')
    
    for  file in tqdm(files):
        sleep(.1)
        full_file_name = os.path.join(dirpath, file)
        if os.path.join(dirpath) == src:
            if file.endswith("pdf"):
                if python_pt:
                    i+=1
                elif java_pt1 or java_pt2:
                    a+=1
print("{} file 1 \n".format(i))
print("{} file 2 \n".format(a))

【问题讨论】:

  • 我没有检查正则表达式的有效性,但是你使用的变量 python_pt、java_pt1 和 java_pt2 是有缺陷的。它们是字符串。因此,例如,if python_pt 将始终返回 True
  • 什么是src?另外,您在滥用锚点,这些模式都没有真正起作用,因为$ 标记了字符串的结尾,之后您需要更多的字符。而且你从不使用模式,因为要运行正则表达式检查,你需要使用re.match/re.search/re.fullmatch。请确保您使用更新的模式尝试这些(不随机使用锚点),如果仍然失败,请编辑问题。
  • @WiktorStribiżew src = 驱动器 C 的路径:
  • @BrutusForcus 我不明白你的评论这不是我们创建模式的方式??
  • @khaledM_dev 您的代码中没有任何内容尝试使用 RE 模式来匹配从 os.walk() 返回的文件名。我建议使用 glob 来获取所有以 '.pdf' 结尾的文件的简化列表,然后使用 re 模块查看哪些是相关的(如果有的话)。

标签: python regex if-statement path


【解决方案1】:

问题在于您的正则表达式和执行正则表达式检查的方式:

  • 不能在图案内随意使用锚点; $ 在中间使用后会使模式无效(字符串结尾后不能有字符)。由于您需要检查文件名是否以您的模式结尾,请仅在末尾添加 $,并且不要忘记转义文字 .
  • 要检查是否有匹配项,您需要使用re.search / re.match / re.fullmatch 方法之一。

这是一个固定的sn-p:

import re, os
from os import path 
from tqdm import tqdm
from time import sleep 

python_pt= r"[0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2} python\.pdf$" # FIXED
java_pt1= r"[0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2} java\.pdf$"    # FIXED
java_pt2= r"java [0-3]?[0-9]-[0-3]?[0-9]-(?:[0-9]{2})?[0-9]{2}\.pdf$"    # FIXED

src = "C:"
i=0
a=0

for dirpath, dirnames, files in os.walk(src, topdown=True):         
    print(f'\nFound directory: {dirpath}\n')
    
    for  file in tqdm(files):
        sleep(.1)
        full_file_name = os.path.join(dirpath, file)
        if os.path.join(dirpath) == src:
            if file.endswith("pdf"):
                if re.search(python_pt, file):                               # FIXED
                    i+=1
                elif re.search(java_pt1, file) or re.search(java_pt2, file): # FIXED
                    a+=1
print("{} file 1 \n".format(i))
print("{} file 2 \n".format(a))

查看# FIXED 行。

【讨论】:

  • 谢谢你的解释我不知道如何使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多