2017-09-27 8 views
3

두 개의 여러 줄 문자열과 다른 점을 얻는 가장 좋은 방법은 무엇입니까?파이썬 - 문자열 간의 차이점 만 알아보기

a = 'testing this is working \n testing this is working 1 \n' 
b = 'testing this is working \n testing this is working 1 \n testing this is working 2' 

diff = difflib.ndiff(a,b) 
print ''.join(diff) 

이 생성됩니다

testing this is working 2 :

정확하게 얻을 수있는 가장 좋은 방법은 무엇입니까
t e s t i n g  t h i s  i s  w o r k i n g  
    t e s t i n g  t h i s  i s  w o r k i n g  1  
+ + t+ e+ s+ t+ i+ n+ g+ + t+ h+ i+ s+ + i+ s+ + w+ o+ r+ k+ i+ n+ g+ + 2 

?

정규식을 사용 하시겠습니까?

+3

'b.split (a)'.? –

+0

젠장 @Chris_Rands. 결코 그것에 관해 생각하지 마라!! 좋은 해킹. –

+0

@Chris_Rands 멋진 해킹을 할 수 있지만 좋은 방법은 아닙니다. –

답변

3
a = 'testing this is working \n testing this is working 1 \n' 
b = 'testing this is working \n testing this is working 1 \n testing this is working 2' 

splitA = set(a.split("\n")) 
splitB = set(b.split("\n")) 

diff = splitB.difference(splitA) 
diff = ", ".join(diff) # ' testing this is working 2, more things if there were...' 

기본적으로 각 문자열을 라인의 세트를 제작하고, 차 집합을 복용 - A.에없는 B에, 즉 모든 것은 그런 다음 결과를 가져 와서 모두 하나의 문자열로 합치십시오.

편집 :이 @ShreyasG 말한 말의 conveluded 방법입니다 - [X X 용하지 Y에서 X의 경우]

0

건물 @Chris_Rands 의견에, 당신은 너무 splitlines() 작업을 사용할 수 있습니다 (귀하의 문자열을 멀티 라인이 있다면 당신은 하나에 존재하지만 다른하지 라인 원하는) :

b_s = b.splitlines() 
a_s = a.splitlines() 
[x for x in b_s if x not in a_s] 

예상 출력을 입니다 :

[' testing this is working 2'] 
2

가장 쉬운 해킹, split()를 사용하여, @Chris을 신용한다.

참고 : : 더 긴 문자열을 결정해야하며 분할을 위해 사용해야합니다.

if len(a)>len(b): 
    res=''.join(a.split(b))    #get diff 
else: 
    res=''.join(b.split(a))    #get diff 

print(res.strip())      #remove whitespace on either sides 

# 드라이버는

IN : a = 'testing this is working \n testing this is working 1 \n' 
IN : b = 'testing this is working \n testing this is working 1 \n testing this is working 2' 

OUT : testing this is working 2 

편집 값 : @ekhumoro- 덕분에 replace을 사용하여 다른 해킹을 위해, 필요한 join 계산의 필요없이.

if len(a)>len(b): 
    res=a.replace(b,'')    #get diff 
else: 
    res=b.replace(a,'')    #get diff 
+1

'b.replace (a, '')는 더 간단하고 빠르며 더 이해가됩니다. – ekhumoro

+0

하하, 이거 사랑해. 좋은 또 다른 해킹. 나는 결코 그런 방법으로'split' 또는'replace'를 사용하는 것을 생각하지 않았습니다. 고맙습니다. –

0
import itertools as it 


"".join(y for x, y in it.zip_longest(a, b) if x != y) 
# ' testing this is working 2' 

또는

import collections as ct 


ca = ct.Counter(a.split("\n")) 
cb = ct.Counter(b.split("\n")) 

diff = cb - ca 
"".join(diff.keys()) 
2

이 Godron629의 대답 @ 기본적이지만, 내가 언급하지 수 있기 때문에 ... 나는 여기에 약간의 수정을해서 게시하고 있는데, 을 symmetric_difference으로 변경하면 그 순서가 중요하지 않다.

a = 'testing this is working \n testing this is working 1 \n' 
b = 'testing this is working \n testing this is working 1 \n testing this is working 2' 

splitA = set(a.split("\n")) 
splitB = set(b.split("\n")) 

diff = splitB.symmetric_difference(splitA) 
diff = ", ".join(diff) # ' testing this is working 2, some more things...'