2012-04-09 20 views
1

2つの文字列を指定すると、Pythonではどの単語が追加され、どの単語が2つの単語間で削除されたかを判断できるようになります。私はdifflibを見たことがあるが、明らかにそれはできない。2つの文字列間の単語の追加と削除を取得

たとえば、「hello my name is」および「hello my guys」と指定すると、追加単語として['guys']が返され、削除された単語として['name']が返されます。どうもありがとう。

EDIT:私が与えた例はおそらく最良ではありませんでした。また、現在のテキストと新しいテキストの間にスペースを入れないでください。たぶんdifflibを使ってすべての新しいセクションを取得した後、regexp "\ b"で分割します。私はそれを試してみましょう。

+2

は ''と ' "世界こんにちは" "Hello World" の'のための所望の出力を何? –

+0

提案したような例はもうありますか? – jamylak

+0

あなたの例が「最高ではなかった」場合は、改善してください。予想される入力と期待される出力のリストは非常に役に立ちます。 – bukzor

答えて

0

これは特に綺麗ではありませんが、私が考えることができるほとんどの場合はうまくいくようです。私はこれもあまりにも整理することができ、大文字と小文字を区別しないようにするのは簡単だろうと確信しています。

def freqs(list): 
    words = {} 
    for word in list: 
     words[word] = words.get(word, 0) + 1 
    return words 

def added_and_removed(a, b): 
    af = freqs(a.split()) 
    bf = freqs(b.split()) 

    removed = [] 
    added = [] 

    for key in af: 
     num = bf.get(key) 
     if num == None: 
      if af[key] > 1: 
       words = [key]*af[key] 
       removed.extend(words) 
      else: 
       removed.append(key) 

    for key in bf: 
     num = af.get(key) 
     if num == None: 
      added.append(key) 
     elif num > 1: 
      words = [key]*(num-1) 
      removed.extend(words) 

    return added, removed 

a = 'hello hello hello my name is Dave dave bar foo' 
b = 'hello my guys is test easy rob dave beef foo'  

added, removed = added_and_removed(a, b) 
print added 
print removed 

のpythonについて覚えておくべき最初の事は、それが "電池が含まれている" したことである

['beef', 'rob', 'easy', 'test', 'guys'] 
['bar', 'name', 'Dave', 'hello', 'hello'] 
+0

このソリューションは正常に動作しているようですが、ありがとうございます! – user1264201

0
before = "hello my name is" 
after = "hello my guy is test" 


before = before.split(' ') 
after = after.split(' ') 

for item in after: 
    if not item in before: 
     print item 
1

を与えます。つまり、標準ライブラリで、必要な処理を行うためのツールを探してから、自分で再作成する必要があります。

difflib.SequenceMatcherを再利用して文字列の違いを探すのがより強力な方法です。例:これは明らかに正確に行うためにカスタマイズすることができ、この出力を生成

import difflib 

before = 'hello my name is' 
after = 'hello my guys is' 

def isjunk(string): 
    "Return True if we don't care about this string" 
    return string == ' ' 


s = difflib.SequenceMatcher(isjunk) 
s.set_seqs(before, after) 

for (
     opcode, 
     before_start, before_end, 
     after_start, after_end 
) in s.get_opcodes(): 
    if opcode == 'equal': 
     # We don't care. 
     continue 

    print "%7s '%s' -> '%s'" % (
      opcode, 
      before[before_start:before_end], 
      after[after_start:after_end], 
    ) 

あなたが必要なもの:

replace 'name' -> 'guys' 
関連する問題