2012-04-22 4 views
3

申し訳ありませんが、Googleが私に与えてくれた解決策の中から実際の解決策を見つけることはできませんでした。(いくつかのサイトでいくつかの "レシピ"bvCase insensitive Regex Dictionaryからの置換

私はファイルの名前を変更していますので、ファイル名を吐き出す関数があります。これは単に 'test_string's'を使っています。 : これらのすべての教授が異なったやり方で最も一般的なものであり、これらのすべてのものを取り除くことなく扱うことが不可能なので、すべての点(および下線)やものが最初に削除されます。 5例:

test_string_1 = 'legal.studies.131.race.relations.in.the.United.States.' 

'legal.studies' - > '法学'

test_string_2 = 'mediastudies the triumph of bluray over hddvd' 

'mediastudies' - > 'メディア研究'、 'ブルーレイ' - >「ブルーレイ 'HDDVD' - - > 'HD DVD'

test_string_3 = 'computer Science Microsoft vs unix' 

'コンピュータサイエンス' - > 'コンピュータサイエンス'、 'UNIX' - > 'UNIX'

test_string_4 = 'Perception - metamers dts' 

'知覚' は既に(良いでしょうが、誰心配)、大きな絵はとても 'DTS'、彼らはそこでオーディオ情報を保存しておきたいです - > DTS

test_string_5 = 'Perception - Cue Integration - flashing dot example aac20 xvid' 

'aac20' - > 'AAC2.0'、 'xvidから' - > ' XviDの」

は、現在、私のようなものを介してこれを実行している:私はそれらすべてが1行にまとめてsmushed持っ

new_string = re.sub(r'(?i)Legal(\s|-|)Studies', 'Legal Studies', re.sub(r'(?i)Sociology', 'Sociology', re.sub(r'(?i)Media(\s|-|)Studies', 'Media Studies', re.sub(r'(?i)UNIX', 'UNIX', re.sub(r'(?i)Blu(\s|-|)ray', 'Blu-ray', re.sub(r'(?i)HD(\s|-|)DVD', 'HD DVD', re.sub(r'(?i)xvid(\s|-|)', 'XviD', re.sub(r'(?i)aac(\s|-|)2(\s|-|\.|)0', 'AAC2.0', re.sub(r'(?i)dts', 'DTS', re.sub(r'\.', r' ', original_string.title())))))))))) 

。私は変更/更新していないので(私の脳/ ADDの仕組みのように)、私は一度は他のことをやっているうちに、できるだけ最小限/最小限にする方が簡単ですもうこの部分と一緒に。

だから、私の例で:私は本当に私は辞書か何かを持っていたいもののようなものになることを始めているこれらのより多くを持っているように

new_test_string_1 = 'Legal Studies 131 Race Relations In The United States' 
new_test_string_2 = 'Media Studies The Triumph Of Blu-ray Over HD DVD' 
new_test_string_3 = 'Computer Science Microsoft Vs UNIX' 
new_test_string_4 = 'Perception - Metamers DTS' 
new_test_string_5 = 'Perception - Cue Integration - Flashing Dot Example AAC2.0 XviD' 

しかし、 - 私は「ドンクレイジーにコードを爆破したくはありませんが、実際の生活の例が追加されるようになると新しい置換を加えることができるようにしたいと考えています(たとえば、オーディオコーデック/コンテナ/そこに、私はちょうどそれらをすべて投げなければならないかもしれないように見える)。私はこのマスターリスト/辞書/どのような方法で使用されているかについて意見はありません。

大きな画像:ファイル名に空白とアンダースコアを入れて大文字で置き換えています(現時点では、私が作っているresを除いて、大文字小文字が完全ではなく、出力に必要な入力にスペース、ダッシュ、ドットなどがある場合とない場合があります。

同様に、名前の付いていない(ラムダなどの)関数が1ライナーであることが望ましいでしょう。

P.S. 奇妙なものや初期の明快さの欠如のために申し訳ありません。ここでの問題の1つは私の主要な/研究の中にあります。ほとんどのものは実際にはかなり簡単ですが、Blu-ray、HD DVD、DTS、AAC2.0、XviDなどすべてのクラスが必要です。

+1

せずにそれを行うためのより良い方法は何ですか?少なくとも3と同じように。 – Jack

+1

あなたの例は実際には「法律学131のレース関係を「法律学131のレース関係」ではなく」 – jamylak

+0

@Jack申し訳ありません、私はこれを2回、それは質問を提出する前に、より良い例ではなく、私を助けようとしている人々にとってより多くの例が悪化することを決めました。次回私が質問したときに私がたくさんあることを確かめる必要があります。 = D –

答えて

1
import re 

def string_fix(filename, dict): 
    filename = filename.replace('.', ' ') 
    for key, val in dict.items(): 
     filename = re.sub(key, val, filename, flags=re.IGNORECASE) 
    return filename 

dict = { 
     r'Legal[\s\-_]?Studies' : 'Legal Studies', 
     r'Media[\s\-_]?Studies' : 'Media Studies', 
     r'dts' : 'DTS', 
     r'hd[\s\-_]?dvd': 'HD DVD', 
     r'blu[\s\-_]?ray' : 'Blu-ray', 
     r'unix' : 'UNIX', 
     r'aac[\s\-_]?2[\.]?0' : 'AAC2.0', 
     r'xvid' : 'XviD', 
     r'computer[\s\-_]?science' : 'Computer Science' 
    } 

string_1 = 'legal.studies.131.race.relations.in.the.United.States.' 
string_2 = 'mediastudies the triumph of bluray over hddvd' 
string_3 = 'computer Science Microsoft vs unix' 
string_4 = 'Perception - metamers dts' 
string_5 = 'Perception - Cue Integration - flashing dot example aac20 xvid' 

print(string_fix(string_1, dict)) 
print(string_fix(string_2, dict)) 
print(string_fix(string_3, dict)) 
print(string_fix(string_4, dict)) 
print(string_fix(string_5, dict)) 
+0

@RobinHood私のソリューションは機能しましたか? – Jack

2
>>> import re 
>>> def string_fix(text,substitutions): 
     text_no_dots = text.replace('.',' ').strip() 
     for key,substitution in substitutions.items(): 
      text_no_dots = re.sub(key,substitution,text_no_dots,flags=re.IGNORECASE) 
     return text_no_dots 

>>> teststring = 'legal.studies.131.race.relations.in.the.U.S.' 
>>> d = { 
    r'Legal(\s|-|)Studies' : 'Legal Studies', 
    r'Sociology'   : 'Sociology', 
    r'Media(\s|-|)Studies' : 'Media Studies' 
} 
>>> string_fix(teststring,d) 
'Legal Studies 131 race relations in the U S' 

そして、ここであなたには、いくつかのより多くのサンプルテキストを提供することができ、辞書

>>> teststring = 'legal.studies.131.race.relations.in.the.U.S.' 
>>> def repl(match): 
     return ' '.join(re.findall('\w+',match.group())).title() 

>>> re.sub(r'Legal(\s|-|)Studies|Sociology|Media(\s|-|)Studies',repl,teststring.replace('.',' ').strip(),flags=re.IGNORECASE) 
'Legal Studies 131 race relations in the U S' 
+0

さて、最初の例を見ています。 2番目の例は、私がやろうとしていることをやっているようですが、逆の順序で行っているようです。しかし、私は "repl"の使用に迷ってしまうので、repl(これは最初の引数ではないので)の場合、私は(現時点で)私はそれを調整する方法を理解できません。 –

+0

'repl'は検索文字列を見つけるたびに置換を提供するために呼び出されるメソッドです。 「法的研究」。それは、「マッチ」の各単語を見つけてスペースで結合することだけです。これは、あなたの例で使用したように、単語にハイフンが含まれている場合に必要です。次にタイトルに変換します(各単語の最初の文字が大文字になります)。これは、これを置換として返します。 – jamylak

+0

私はちょうどあなたが質問を更新したことに気づいたので、単語が何かで区切られていない場所では動作しないかもしれないが、それは元の例にはなかった。 – jamylak