0

该程序遍历一个目录并将文件名(如果可能)修复为特定格式的空格、连字符等。该方法regexSubFixGrouping()将文件名中的不正确空格更改为正确的空格。该方法checkProper()向您准确显示所需的格式。

正确的格式:

201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.pdf

除了正则表达式还应该插入可能丢失的前 4 个连字符中的任何一个之外,一切都运行良好。在这一点上,我并不太担心额外的连字符,也许是在路上。主要是,我只希望它插入前 4 个缺失的连字符中的任何一个(并保持它当前的所有纠正空白的功能等)。

方法:

def readDir(path1):
    return [ f for f in os.listdir(path1) if os.path.isfile(os.path.join(path1,f)) ]

def checkProper(f,term):
    return re.match(term + '\s-\s\(\d{5}\)\s-\s\w{3}\s\d{4}\w?-\d{3}-[^\.]+\s-\s[^\.]+\.txt', f)


def regexSubFixGrouping(f,term):
    """ Much improved version of regexSubFix(). Corrects improper whitespace in filename """
    return re.sub(term + r'\s*-\s*(\(\d{5}\))\s*-\s*(\w{3}\s\d{4}\w?-\d{3}\s*-\s*(?:[^.\s]|\b\s\b)+)\s*-\s*([^.]+\.pdf)$',
          lambda match: term+' - {0} - {1} - {2}'.format(match.group(1),
          re.sub(r'\s*-\s*', '-', match.group(2)),
          match.group(3)) ,
          f)

def properFiles(dir1,term,path1):
""" Main functionality. Goes through list of files in directory, separates good from bad and fixes what it can. """
goodMatch = []; stillWrong = []; goodFix = [] #; fixed = ""
for f in dir1:
    result = checkProper(f,term)
    if result: goodMatch.append(result.group(0))
    else:
        fixed = regexSubFixGrouping(f,term)
        #print "^^^^^^   ",fixed
        if checkProper(fixed,term):
            os.rename(path1+'\\'+f, path1+'\\'+fixed); goodFix.append(fixed)
        else: os.rename(path1+'\\'+f, path1+'\\'+'@ '+fixed); stillWrong.append(fixed)
goodToGo = len(goodMatch)+len(goodFix); total = len(dir1); successRate = (goodToGo/(float(total)))*100.0
print "%d total files. %d files now in proper format. %0.2f%% success rate."%(total,goodToGo,successRate)
print "All files not in proper format are appended with @ to be clearly marked for the user."
return goodMatch, goodFix, stillWrong

所以它应该能够修复带有这些(缺少连字符)错误的文件名:

201308 - (82431) - MAC 1105-006 College Algebra - Graziose, James.pdf

201308 - (82610) - MAC 2233-009 Methods of Calculus - Grigoriev, Stepan.pdf

还有错误,其中第二个连字符后的 3 个大写字母在其后的 4 个整数之前没有空格:

201308 - (91500) - MAC1105-014 - College Algebra - Radulovic, AiBeng.pdf

如果可能的话,我只想调整regexSubFixGrouping()方法而不是使用系统资源来运行更多的正则表达式。我正在自学 Python,所以我确信任何初级程序员都可以做到这一点,但如果专业人士遇到这个问题,他们可以轻松解决这个问题。

编辑:剩余的异常值:

201308 - (82442) - MAC 1105 - 012 - 大学代数 - Harmon, Drake.pdf
201308 - (92835) - MAC 1105 - 017 - 大学代数 - Harmon, Drake.pdf
201308 - (95125) - MAC1147-004 - Precaclculus Algebra & Trig - Greenberg, Alisa.pdf
201308 - (82600) - MAC1147-002 - Precaclculus Algebra & Trig - Greenberg, Alisa.pdf

前 2 我不知道为什么他们没有抓到。它们似乎真的是可以修复的。第二个 2,我不确定为什么它没有MAC用空格分隔1147.

4

1 回答 1

1

您可以在函数中编辑第二个re.sub,尽管您还必须编辑第一个re.sub以适应此更改:

return re.sub(term + r'\s*-\s*(\(\d{5}\))\s*-\s*(\w{3}\s?\d{4}\w?-?\d{3}\s*-?\s*(?:[^.\s]|\b\s\b)+)\s*-\s*([^.]+\.pdf)$',
      lambda match: term+' - {0} - {1} - {2}'.format(match.group(1),
      re.sub(r'(\w{3})\s?(\d{4}\w?)\s*-?\s*(\d{3})\s*-?\s*(.*)', r'\1 \2-\3-\4', match.group(2)),
      match.group(3)) ,
      f)

第二个re.sub现在从头开始解析“中间部分”。

我不知道这将如何影响您以前拥有的文件名,因为我为正则表达式增加了一些灵活性以接受那些“错误格式”。

编辑:没有考虑“&”并且忘记在第三个连字符周围放置空格。将此正则表达式用于第一个 re.sub:

\s*-\s*(\(\d{5}\))\s*-\s*(\w{3}\s*\d{4}\w?\s*-?\s*\d{3}\s*-?\s*(?:[^.\s]|\b\s\b|\s&\s)+)\s*-\s*([^.]+\.pdf)$
于 2013-10-07T05:50:24.483 回答