2016-07-18 17 views
0

私はPythonで2つの関数を書いています。 私はreplace()を実行すると、replacementという名前のデータ構造を調べます。それはキーを受け取り、文書を反復し、文書内の単語とキーが一致すると、その単語を値で置き換えます。Pythonの検索と置換

これは、テキストファイルの内容によっては、 '停止'と '一時停止'の変更が '停止'に変更されているためですそれはファイルを通過し、いくつかの単語が変更され、元に戻って変更されます(つまり、変更は行われません)

私はreplace2()を実行すると、テキスト文書から各単語を取り出し、交換。そうであれば、私はそれを置き換えます。私が気づいたことは、これを実行すると、サスペンド(部分文字列 "ended"を含む)が "サスペンド"として終わるのですか?

テキストファイルを繰り返し処理する簡単な方法はありますか?見つかった場合は、単語を一度だけ変更しますか?私はreplace2()が欲しいものをやっていると思いますが、私はフレーズを失っていますが、split()関数を使ったときと同じように、部分文字列を受け取ってはいけません。

def replace(): 
     fileinput = open('tennis.txt').read() 
     out = open('tennis.txt', 'w') 
     for i in replacements.keys(): 
      fileinput = fileinput.replace(i, replacements[i]) 
      print(i, " : ", replacements[i]) 
     out.write(fileinput) 
     out.close 


def replace2(): 
     fileinput = open('tennis.txt').read() 
     out = open('tennis.txt', 'w') 
     #for line in fileinput: 
     for word in fileinput.split(): 
      for i in replacements.keys(): 
       print(i) 
       if word == i: 
        fileinput = fileinput.replace(word, replacements[i]) 
     out.write(fileinput) 
     out.close 

replacements = { 
    'suspended' : 'stopped', 
    'stopped'  : 'suspended', 
    'due to'  : 'because of', 
    'ended'  : 'finished', 
    'finished'  : 'ended', 
    '40'   : 'forty', 
    'forty'  : '40', 
    'because of' : 'due to' } 

それが始まった後、試合はわずか40分で雨による終了。雨のために が中断されました。

答えて

1

改善されたrawbeansのバージョンです。置換キーの中には複数の単語が含まれているため、期待通りに機能しませんでした。

あなたの例のラインでテストし、それが出力:このケースでthe match finished because of rain a mere forty minutes after it started. it was stopped due to rain.

import re 

def replace2(): 
    fileinput = open('tennis.txt').read() 
    out = open('tennisout.txt', 'w') 
    #for line in fileinput: 

    wordpats = '|'.join(replacements.keys()) 
    pattern = r'({0}|\w+|\W|[.,!?;-_])'.format(wordpats) 
    words = re.findall(pattern, fileinput) 
    output = "".join(replacements.get(x, x) for x in words) 
    out.write(output) 
    out.close() 


replacements = { 
    'suspended' : 'stopped', 
    'stopped'  : 'suspended', 
    'due to'  : 'because of', 
    'ended'  : 'finished', 
    'finished'  : 'ended', 
    '40'   : 'forty', 
    'forty'  : '40', 
    'because of' : 'due to' } 


if __name__ == '__main__': 
    replace2() 
0

テキストファイルを反復処理だけ見つかった場合は、一度単語を変更する簡単な方法はありますか?

はるかに簡単な方法はあり:

output = " ".join(replacements.get(x, x) for x in fileinput.split()) 
out.write(output) 
+0

を、単語が(「40」と言うことができます)であることを、私は40のすべての出現を望んで、テキストで4回現れた場合「40」に変更されました。 単語を一度だけ変更することは、replace()関数を使用しているときに起こりました。これは単語 '40'を'40 'に置き換え、もう一度元の' 40 'に戻ります。 – user1031551

+0

私の答えを更新しました.. – SuperSaiyan

+0

ここでの主な問題は、句読点が考慮されていないことです。単語の後にピリオドまたはカンマがある場合、置換されません。 – rawbeans

0

、句読点を占め代わりsplit()の正規表現を使用するには:

output = " ".join(replacements.get(x, x) for x in re.findall(r"[\w']+|[.,!?;]", fileinput)) 
out.write(output) 

この方法では、句読点を交換する時に無視されます、最終的な文字列に表示されます。説明と潜在的な警告については、this postを参照してください。