difflib — 델타(delta) 계산 헬퍼

difflib — 델타(delta) 계산 헬퍼

이 모듈은 시퀀스를 비교하는 클래스와 함수를 제공합니다. 대부분은 텍스트 줄 시퀀스(예: 문자열 리스트나 파일 객체)를 비교하고 차이에 대한 보고인 diff를 생성합니다. diff는 HTML, 컨텍스트 및 통합 diff(_diff_나 git diff 같은 도구가 만드는 형식) 등 다양한 형식으로 만들 수 있습니다. 비교는 모든 유형의 시퀀스 쌍을 비교하는 유연한 클래스인 SequenceMatcher로 구현된 매칭 알고리즘을 사용하며, 시퀀스 요소가 해시 가능하기만 하면 텍스트가 아니어도 됩니다.

출처: Python documentation

본문

difflib 알고리즘

Ratcliff와 Obershelp 알고리즘의 확장으로, difflib는 가장 긴 정크 없는(junk-free) 연속 부분 시퀀스를 검색합니다. (CPython 구현 세부 사항으로 타이밍에 대한 내용이 있습니다.)

Diff 생성

class difflib.Differ는 텍스트 줄 시퀀스를 비교하고 사람이 읽을 수 있는 차이, 즉 델타를 생성하는 클래스입니다. Differ는 SequenceMatcher를 줄 시퀀스 비교와 유사한(거의 일치하는) 줄 내의 문자 시퀀스 비교 모두에 사용합니다. Differ 델타의 각 줄은 두 글자 코드로 시작합니다:

코드 의미
'- ' 시퀀스 1에만 있는 줄
'+ ' 시퀀스 2에만 있는 줄
' ' 두 시퀀스에 공통인 줄
'? ' 두 입력 시퀀스 어디에도 없는 줄

compare(a, b) 메서드는 두 줄 시퀀스를 비교하고 델타(줄 시퀀스)를 생성합니다. diff 전에 끝의 개행이 제거되므로 결과가 불완전할 수 있습니다.

주요 함수:

  • difflib.context_diff(a, b, fromfile='', tofile='', fromfiledate='', tofiledate='', n=3, lineterm='\n')ab(문자열 리스트)를 비교하고 컨텍스트 diff 형식의 델타(델타 줄을 생성하는 제너레이터)를 반환합니다.
  • difflib.ndiff(a, b, linejunk=None, charjunk=IS_CHARACTER_JUNK)ab를 비교하고 Differ 스타일 델타를 반환합니다. 선택적 키워드 매개변수 linejunkcharjunk는 필터링 함수(또는 None)입니다. charjunk는 문자(길이 1 문자열)를 받아 정크면 true, 아니면 false를 반환하는 함수이며, 기본은 공백 문자를 걸러내는 모듈 수준 함수 IS_CHARACTER_JUNK()입니다.
  • difflib.restore(sequence, which) — 델타를 생성한 두 시퀀스 중 하나를 반환합니다. Differ.compare()ndiff()가 만든 sequence에서 파일 1 또는 2(매개변수 which)에서 온 줄을 추출하고 줄 접두사를 제거합니다.
  • difflib.unified_diff(a, b, fromfile='', tofile='', fromfiledate='', tofiledate='', n=3, lineterm='\n')ab를 비교하고 통합 diff 형식의 델타를 반환합니다. 줄 끝 개행이 없는 입력은 출력이 균일하게 개행이 없도록 lineterm 인자를 ""로 설정하세요.

SequenceMatcher 객체

SequenceMatcher는 임의의 시퀀스 쌍을 비교하는 유연한 클래스입니다. 주요 메서드:

  • get_matching_blocks() — 겹치지 않는 일치 부분 시퀀스를 설명하는 삼중항 리스트를 반환합니다. 각 삼중항은 (i, j, n) 형태로 a[i:i+n] == b[j:j+n]을 의미하며, ij에 대해 단조 증가합니다.

SequenceMatcher는 비율(ratio), 유사도 측정, 공통 부분 문자열 등을 포함하여 두 시퀀스의 유사성을 분석하는 데 사용됩니다. 또한 자동 정크 발견(autojunk) 휴리스틱을 지원합니다.

예제

>>> d = Differ()
>>> result = list(d.compare(text1, text2))

Differ 객체를 인스턴스화할 때 줄과 문자 "정크"를 걸러내는 함수를 전달할 수 있습니다. difflib는 명령줄 인터페이스도 제공하며, context_diff/unified_diff 등을 사용해 파일 간 차이를 표준 출력으로 출력할 수 있습니다.

더 알아보기 (Learn more)