2012-04-09 4 views
1

두 개의 문자열이 주어지면 파이썬에서 어떤 단어가 추가되었는지, 두 단어 사이에 어떤 단어가 제거되었는지 확인할 수 있습니다. difflib를 본 적이 있지만 분명히 할 수는 없습니다.두 문자열 사이에 단어를 추가하거나 제거하십시오.

예를 들어 'hello my name is'및 'hello my guys'가 주어지면 [ 'guys']가 추가 된 단어로, [ 'name']이 (가) 제거 된 단어로 반환됩니다. 고마워.

편집 : 내가 준 예제가 아마도 최고는 아니 었습니다. 또한 현재 텍스트와 새 텍스트 사이에 공백없이 작동해야합니다. 어쩌면 difflib를 사용하여 모든 새 섹션을 얻은 다음 regexp "\ b"로 분할합니다. 나는 그것을 시도 할 것이다.

+2

은''와' "세계 안녕" "안녕 세계"'에 원하는 출력을 무엇입니까 ? –

+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 

['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' 
관련 문제