[python] 파이썬-두 문자열의 차이점

목록에 많은 단어를 저장하고 싶습니다. 이 단어의 대부분은 매우 유사합니다. 예를 들어 나는 단어가 afrykanerskojęzyczny와 같은 단어의 많은 afrykanerskojęzycznym, afrykanerskojęzyczni, nieafrykanerskojęzyczni. 두 문자열의 차이를 찾고 첫 번째 문자열과 diff에서 두 번째 문자열을 복원하는 효과적인 (빠르고 작은 diff 크기 제공) 솔루션은 무엇입니까?



답변

difflib 모듈에서 ndiff 를 사용 하여이를 수행 할 수 있습니다 . 한 문자열을 다른 문자열로 변환하는 데 필요한 모든 정보가 있습니다.

간단한 예 :

import difflib

cases=[('afrykanerskojęzyczny', 'afrykanerskojęzycznym'),
       ('afrykanerskojęzyczni', 'nieafrykanerskojęzyczni'),
       ('afrykanerskojęzycznym', 'afrykanerskojęzyczny'),
       ('nieafrykanerskojęzyczni', 'afrykanerskojęzyczni'),
       ('nieafrynerskojęzyczni', 'afrykanerskojzyczni'),
       ('abcdefg','xac')]

for a,b in cases:
    print('{} => {}'.format(a,b))
    for i,s in enumerate(difflib.ndiff(a, b)):
        if s[0]==' ': continue
        elif s[0]=='-':
            print(u'Delete "{}" from position {}'.format(s[-1],i))
        elif s[0]=='+':
            print(u'Add "{}" to position {}'.format(s[-1],i))
    print()

인쇄물:

afrykanerskojęzyczny => afrykanerskojęzycznym
Add "m" to position 20

afrykanerskojęzyczni => nieafrykanerskojęzyczni
Add "n" to position 0
Add "i" to position 1
Add "e" to position 2

afrykanerskojęzycznym => afrykanerskojęzyczny
Delete "m" from position 20

nieafrykanerskojęzyczni => afrykanerskojęzyczni
Delete "n" from position 0
Delete "i" from position 1
Delete "e" from position 2

nieafrynerskojęzyczni => afrykanerskojzyczni
Delete "n" from position 0
Delete "i" from position 1
Delete "e" from position 2
Add "k" to position 7
Add "a" to position 8
Delete "ę" from position 16

abcdefg => xac
Add "x" to position 0
Delete "b" from position 2
Delete "d" from position 4
Delete "e" from position 5
Delete "f" from position 6
Delete "g" from position 7


답변

나는 ndiff 대답을 좋아하지만 모든 것을 변경 사항 목록에 모두 넣고 싶다면 다음과 같이 할 수 있습니다.

import difflib

case_a = 'afrykbnerskojęzyczny'
case_b = 'afrykanerskojęzycznym'

output_list = [li for li in difflib.ndiff(case_a, case_b) if li[0] != ' ']


답변

regex 모듈 (퍼지 섹션)을 살펴볼 수 있습니다 . 실제 차이를 얻을 수 있는지는 모르겠지만 적어도 삽입, 삭제 및 대체와 같은 허용되는 변경 유형의 수를 지정할 수 있습니다.

import regex
sequence = 'afrykanerskojezyczny'
queries = [ 'afrykanerskojezycznym', 'afrykanerskojezyczni',
            'nieafrykanerskojezyczni' ]
for q in queries:
    m = regex.search(r'(%s){e<=2}'%q, sequence)
    print 'match' if m else 'nomatch'


답변

당신이 요구하는 것은 압축의 특수한 형태입니다. xdelta3 는 이러한 특정 유형의 압축을 위해 설계되었으며 이에 대한 파이썬 바인딩이 있지만 zlib를 직접 사용하는 것은 피할 수 있습니다. 예를 들어 “기본 단어”로 설정된 매개 변수 zlib.compressobjzlib.decompressobj함께 사용하고 싶을 것 입니다.zdictafrykanerskojęzyczny

주의 사항은 zdictpython 3.3 이상에서만 지원되며, 모든 diff에 대해 동일한 “기본 단어”가있는 경우 코딩하는 것이 가장 쉽습니다.


답변

원래 질문에 대한 위의 의견에 대한 답변은 이것이 그가 원하는 전부라고 생각하게 만듭니다.

loopnum = 0
word = 'afrykanerskojęzyczny'
wordlist = ['afrykanerskojęzycznym','afrykanerskojęzyczni','nieafrykanerskojęzyczni']
for i in wordlist:
    wordlist[loopnum] = word
    loopnum += 1

이렇게하면 다음이 수행됩니다.

단어 목록의 모든 값에 대해 단어 목록의 해당 값을 원래 코드로 설정합니다.

단어 목록을 변경해야하는 곳에이 코드를 놓고 단어 목록에 변경해야하는 단어를 저장하고 원래 단어가 올바른지 확인하기 만하면됩니다.

도움이 되었기를 바랍니다!


답변