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

また、2 番目のハイフンの後の 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 なぜ彼らが釣れなかったのか私には分かりません。それらは本当に修正可能のようです。MAC2 番目の 2 つ目は、と をスペースで区切らなかった理由がわかりません1147

4

1 に答える 1

1

この変更に対応re.subするには、最初の関数も編集する必要がありますが、関数の 2 番目の関数を編集できます。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)

2 番目re.subは、「中間部分」を最初から解析します。

ただし、これらの「間違った形式」を受け入れるように正規表現に柔軟性を追加したため、それが以前のファイル名にどのように影響するかはわかりません。

編集:「 & 」を考慮せず、3 番目のハイフンの周りにスペースを入れるのを忘れました。最初の 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 に答える