0

この正規表現は、正確にこの形式で何かを見つける文字列を見つけることになっています:

201308 - (82608) - MAC 2233-007-Methods of Calculus - Lastname, Lee.txt

唯一の注意点は、最後のハイフンと .txt の間の最後の部分であり、その直前のコース名はどちらも可変数の文字 (インストラクター名とコース名) にすることができます。他のすべては、その形式でその数の文字を持ちます (その数のスペースとハイフンで正確に区切られた int 番号、またはすべて大文字の正確なコースプレフィックスのいずれか)。

正規表現が実際に行っていることは、何も見つけていないことです。括弧をエスケープしようとせずに、いくつかのファイルをキャッチしていましたが、今は灘. 明らかに正規表現が完成しておらず、その一部をテストしているため、 re.search代わりに使用しています。re.match

import re, os, sys, shutil

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

def files(dir1,term,path1):
    match2 = []; stillWrong = []#; term = str(term)
    for f in dir1:
        result = re.search(term + "\s\b\s\(\d{5}\)\s\b\s\w{3}\s\d{4}\b\d{3}[a-z\A-Z]+\s\b\s[A-z\a-z]+\b\s[A-Z\a-z]+ .txt",f)
        if result: match2.append(f)
        else: stillWrong.append(f)
        #print "split --- ",os.path.split(f)
        ##else: os.rename(path1+'\\'+f, path1+'\\'+'@ '+f); stillWrong.append(f)
        print "f ---- ",f
    return match2, stillWrong

term = "201308"; src = "testdir1"; dest = "testdir2"

print files(readDir(dest),term,dest)

これは(明らかに)間違っています:

    >>> 
f ----  @ @ @ @ @ @ 123 abc - a-1 - b-2.txt
f ----  @ @ @ @ @ @ 201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt
f ----  @ @ @ @ @ @ 201308 abc 123.txt
f ----  @ @ @ @ @ @ 201308-(12345) - Abc 2233-007-course Name - last, first.txt
f ----  @ @ @ @ @ @ 45-12 - xyz - mno - 123-pqr-tuv-456.txt
f ----  @ @ @ @ @ @ @ @ @ 201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt
f ----  @ @ @ @ @ @ @ @ @ 201308 abc 123.txt
f ----  @ @ @ @ @ @ @ @ @ 201308-(12345) - Abc 2233-007-course Name - last, first.txt
f ----  @ @ @ @ @ @ @ @ @ @ 123 abc - a-1 - b-2.txt
f ----  @ @ @ @ @ @ @ @ @ @ 45-12 - xyz - mno - 123-pqr-tuv-456.txt
f ----  @ @ @ @ @ @ @ @ @ @ @ xxxxx xxxxx xxxxx 123 abc - a-1 - b-2.txt
f ----  @ @ @ @ @ @ @ @ @ @ @ xxxxx xxxxx xxxxx 45-12 - xyz - mno - 123-pqr-tuv-456.txt
([], ['@ @ @ @ @ @ 123 abc - a-1 - b-2.txt', '@ @ @ @ @ @ 201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt', '@ @ @ @ @ @ 201308 abc 123.txt', '@ @ @ @ @ @ 201308-(12345) - Abc 2233-007-course Name - last, first.txt', '@ @ @ @ @ @ 45-12 - xyz - mno - 123-pqr-tuv-456.txt', '@ @ @ @ @ @ @ @ @ 201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt', '@ @ @ @ @ @ @ @ @ 201308 abc 123.txt', '@ @ @ @ @ @ @ @ @ 201308-(12345) - Abc 2233-007-course Name - last, first.txt', '@ @ @ @ @ @ @ @ @ @ 123 abc - a-1 - b-2.txt', '@ @ @ @ @ @ @ @ @ @ 45-12 - xyz - mno - 123-pqr-tuv-456.txt', '@ @ @ @ @ @ @ @ @ @ @ xxxxx xxxxx xxxxx 123 abc - a-1 - b-2.txt', '@ @ @ @ @ @ @ @ @ @ @ xxxxx xxxxx xxxxx 45-12 - xyz - mno - 123-pqr-tuv-456.txt'])
>>> 

ご覧のとおり、match2[]リストには何もありません (興味がある場合、これらは 2 番目のリストのファイル名ですが、1 番目のリストには関連する一致が保持されています)。私はPythonと正規表現を独学していますが、うまくいきません。これら(および正規表現チュートリアル)を試しましたが、この場合は役に立たなかったようです:

Python での正規表現文字列のエスケープ

括弧をエスケープする正規表現

Python 正規表現で \p{L} を実装する方法

コメントアウトされているのはすべてのものですが、とにかくコメントされる前は機能しませんでし@た。os.rename初心者レベルのプログラマなら誰でも数分でこれを終わらせることができると確信していますが、プロがこの質問に出くわし、1分を割いてくれるなら、それも素晴らしいことです.

編集: 使用されるファイル名のリスト (生産リストは明らかにはるかに長いです):

201308-(12345) - Abc 2233-007-course Name - last, first.txt
201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt
@ @ @ @ @ @ 201308 abc 123.txt
@ @ @ @ @ @ 123 abc - a-1 - b-2.txt
@ @ @ @ @ @ 45-12 - xyz - mno - 123-pqr-tuv-456.txt
@ @ @ @ @ @ @ @ @ 201308-(12345) - Abc 2233-007-course Name - last, first.txt
@ @ @ @ @ @ @ @ @ 201308 abc 123.txt
@ @ @ @ @ @ @ @ @ 201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt
@ @ @ @ @ @ @ @ @ @ 123 abc - a-1 - b-2.txt
@ @ @ @ @ @ @ @ @ @ 45-12 - xyz - mno - 123-pqr-tuv-456.txt
@ @ @ @ @ @ @ @ @ @ @ xxxxx xxxxx xxxxx 123 abc - a-1 - b-2.txt
@ @ @ @ @ @ @ @ @ @ @ xxxxx xxxxx xxxxx 45-12 - xyz - mno - 123-pqr-tuv-456.txt
45-12 - xyz - mno - 123-pqr-tuv-456.txt
123 abc - a-1 - b-2.txt
201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt
201308 abc 123.txt
201308-(12345) - Abc 2233-007-course Name - last, first.txt
4

2 に答える 2

2

私にとって非常に奇妙に思えることがいくつかあります。

  • \s\b\sは、「空の文字列に一致しますが、単語の先頭または末尾のみ」\bを意味するため、異常ですが、ここでは、空白を意味する 2 つの記号の間にあります。つまり、単語の先頭または末尾ではありません。

  • アンチスラッシュは[A-z\a-z]エラーを引き起こします。ここで何を意味するのだろうか。sett の可能な文字としてアンチスラッシュが必要ですか? それから書く[A-z\\\\a-z]

この正規表現は、例の文字列と一致します。

r = re.compile(term +
               ("\s-\s"
                "\(\d{5}\)"
                "\s-\s"
                "\w{3}\s\d{4}-\d{3}-"
                "[a-zA-Z ]+"
                "\s-\s"
                "[A-za-z]+,\s"
                "[A-Za-z]+ *.txt"))
于 2013-09-01T18:44:44.420 に答える
1

\d{6}\s-\s\(\d{5}\)\s-\s\w{3}\s\d{4}-\d{3}-[^\.]+\.txt例として送信した文字列と一致します。初期値が不明な場合は、term + '\s-\s\(\d{5}\)\s-\s\w{3}\s\d{4}-\d{3}-[^\.]+\.txt'それを行う必要があります (term正規表現に適している場合)。

テスト実行サンプルの追加:

>>> term = '201308'
>>> f = '201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt'
>>> re.search(term + '\s-\s\(\d{5}\)\s-\s\w{3}\s\d{4}-\d{3}-[^\.]+\.txt', f).group(0)
'201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt'

さらに別:

>>> f = '/somefolder/somefolder2/201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt'
>>> re.search(term + '\s-\s\(\d{5}\)\s-\s\w{3}\s\d{4}-\d{3}-[^\.]+\.txt', f).group(0)
'201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt'

>>> f = 'c:\\somefolder\\somefolder2\\201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt'
>>> re.search(term + '\s-\s\(\d{5}\)\s-\s\w{3}\s\d{4}-\d{3}-[^\.]+\.txt', f).group(0)
'201308 - (82608) - MAC 2233-007-Methods of Calculus - Klingler, Lee.txt'
于 2013-09-01T18:22:48.373 に答える