difflib — 델타(delta) 계산 헬퍼
difflib — 델타(delta) 계산 헬퍼
이 모듈은 시퀀스를 비교하는 클래스와 함수를 제공합니다. 대부분은 텍스트 줄 시퀀스(예: 문자열 리스트나 파일 객체)를 비교하고 차이에 대한 보고인 diff를 생성합니다. diff는 HTML, 컨텍스트 및 통합 diff(_diff_나 git diff 같은 도구가 만드는 형식) 등 다양한 형식으로 만들 수 있습니다. 비교는 모든 유형의 시퀀스 쌍을 비교하는 유연한 클래스인 SequenceMatcher로 구현된 매칭 알고리즘을 사용하며, 시퀀스 요소가 해시 가능하기만 하면 텍스트가 아니어도 됩니다.
본문
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')—a와b(문자열 리스트)를 비교하고 컨텍스트 diff 형식의 델타(델타 줄을 생성하는 제너레이터)를 반환합니다.difflib.ndiff(a, b, linejunk=None, charjunk=IS_CHARACTER_JUNK)—a와b를 비교하고Differ스타일 델타를 반환합니다. 선택적 키워드 매개변수linejunk와charjunk는 필터링 함수(또는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')—a와b를 비교하고 통합 diff 형식의 델타를 반환합니다. 줄 끝 개행이 없는 입력은 출력이 균일하게 개행이 없도록lineterm인자를""로 설정하세요.
SequenceMatcher 객체
SequenceMatcher는 임의의 시퀀스 쌍을 비교하는 유연한 클래스입니다. 주요 메서드:
get_matching_blocks()— 겹치지 않는 일치 부분 시퀀스를 설명하는 삼중항 리스트를 반환합니다. 각 삼중항은(i, j, n)형태로a[i:i+n] == b[j:j+n]을 의미하며,i와j에 대해 단조 증가합니다.
SequenceMatcher는 비율(ratio), 유사도 측정, 공통 부분 문자열 등을 포함하여 두 시퀀스의 유사성을 분석하는 데 사용됩니다. 또한 자동 정크 발견(autojunk) 휴리스틱을 지원합니다.
예제
>>> d = Differ()
>>> result = list(d.compare(text1, text2))
Differ 객체를 인스턴스화할 때 줄과 문자 "정크"를 걸러내는 함수를 전달할 수 있습니다. difflib는 명령줄 인터페이스도 제공하며, context_diff/unified_diff 등을 사용해 파일 간 차이를 표준 출력으로 출력할 수 있습니다.