2017-09-04 4 views
0

私は実際の英語でスラング語とその代用品のリストを含むテキストファイルを持っています。私はスプリットポイントとして ":"を使用してこのテキストファイルを辞書に変換し、変換後に辞書を印刷するとすべてが問題なく表示されます。エラー:位置に何も繰り返しません

ただし、この行に由来するエラー:slangs_re = re.compile('|'.join(slang_dict.keys()))nothing to repeat at position 112207と表示されます。

デバッグ中に、エラーが何らかの形で辞書にリンクされていることがわかりました。これは、下のコードを実行したときに正しい出力が得られなかったためですが、エラーも発生しなかったためです。このコードの予想される出力は「フィットネス」ですが、実際の出力は「フィット」です。

import re 

test = "fitess" 

slang_dict = {"fitess":"fitness", "damm":"damn"} 

slangs_re = re.compile('|'.join(slang_dict.keys())) 

def correct_slang(s, slang_dict=slang_dict): 
    def replace(match): 
     return slang_dict[match.group(0)] 

    return slangs_re.sub(replace, s) 

test = correct_slang(test) 
print(test) 

は、そして、これは辞書とのコードです(申し訳ありませんが、テキストファイルが含まれるには大きすぎる。サンプルがhere利用可能です)。期待される出力は「フィットネス」であるが、実際の出力はエラーです:

import re 

test = "fitess" 

file = open("slang_conversion.txt","r") 

slang_dict = {} 

for line in file: 
    x = line.split(":") 
    a = x[0] 
    b = x[1] 
    c = len(b) - 1 

    b = b[0:c] 

    slang_dict[a] = b 

slangs_re = re.compile('|'.join(slang_dict.keys())) # <-- error 

def correct_slang(s, slang_dict=slang_dict): 
    def replace(match): 
     return slang_dict[match.group(0)] 

    return slangs_re.sub(replace, s) 

test = correct_slang(test) 

print(test) 

他のSOスレッドを読めば、私はそれはいくつかの例のバグだということを知るようになったが、1つではないようですこの場合。

は私が

slangs_re = re.compile(r"(?<!\w){}(?!\w)".format('|'.join([re.escape(x) for x in slang_dict]))) 

slangs_re = re.compile('|'.join(slang_dict.keys())) 

を交換することをお勧め

+0

'slang_dict.keys()にregexメタ文字(' * '、' + 'など)が含まれている場合、それらをエスケープする必要があります。 – Tushar

+0

おそらく、あなたは 'r"(?<!\ w){}(?!\ w) "で修正することができます。 ()])) 'あるいは、すべての単語が文字、数字、 '_ 'で構成されている場合は、' \ w + 'パターンを使用して、値を取得する前にそのキーが辞書に存在するかどうかを確認することさえできます。 –

+0

さらに、 'contractions_re'は' slangs_re'に置き換えなければなりません。 https://ideone.com/VVR3keを参照してください –

答えて

2

ありがとう、あなたが降順に長さによってソートされたキーを渡すことを確認してください。

from collections import OrderedDict 
import re 

test = "fitess no kome*" 

slang_dict = {"Aha aha":"no", "fitess":"fitness", "damm":"damn", "kome*":"come", "ow wow":"rrf"} 
slang_dict = OrderedDict(sorted(slang_dict.iteritems(), key=lambda x: len(x[0]), reverse=True)) 

slangs_re = re.compile(r"(?<!\w){}(?!\w)".format('|'.join([re.escape(x) for x in slang_dict]))) 
def correct_slang(s, slang_dict=slang_dict): 
    def replace(match): 
     return slang_dict[match.group(0)] 

    return slangs_re.sub(replace, s) 

test = correct_slang(test) 
print(test) 

Python demo

これは単語全体としての条件をチェックし、正規表現エンジンに渡す際には問題が発生しないことができるように、検索フレーズのそれぞれに特殊文字をエスケープします参照してください。

単語マッチング全体に関心がない場合は、(?<!\w)(先頭の単語境界を調べる)と(?!\w)(末尾の単語境界を確認する)を削除してください。

+0

ありがとうございます!それは奇妙なエラーにつながる。私は入力を与えている_luv 3アイフォーンawsm表示素晴らしい、soo happy_私は出力が_love 3電話素敵な表示素晴らしい、すっごく幸せ_を期待しています。ただし、これは出力です: _love 3 phone素晴らしい表示はawesomeohame、isohoh hatehappy_。私は辞書の問題をチェックしましたが、何もありません。これの理由は何でしょうか?なぜすごく素晴らしいものになっていますか? –

+0

@ MythicCocoa結果パターンは何ですか? http://pastebin.comで共有できますか? –

+0

'(?<!\ w){}(?!\ w)'を使いましたか?あなたが単語チェック全体を省略したように見えます。 –

関連する問題