파이썬 lower()와 casefold(), 대소문자를 무시한 비교의 차이

이 카테고리 글 목록

전체글 보기

파이썬 문자열에서 대소문자를 무시하고 비교하려면 양쪽에 casefold()를 적용한 뒤 ==로 비교하세요. 영문 A와 a는 lower()로도 같아지지만, 독일어 ß처럼 비교할 때 표기가 바뀌는 글자에서는 결과가 달라집니다.

아래는 가상의 표지 이름입니다. 두 방식으로 만든 비교값을 출력하고, 화면에 보여 줄 원래 표기도 확인합니다.

label = "Fußweg"
entered = "FUSSWEG"

lower_label, lower_entered = label.lower(), entered.lower()
folded_label, folded_entered = label.casefold(), entered.casefold()

print("lower", lower_label, lower_entered, lower_label == lower_entered)
print("casefold", folded_label, folded_entered, folded_label == folded_entered)
print("표시", label)
lower fußweg fussweg False
casefold fussweg fussweg True
표시 Fußweg

소문자 표기와 비교에 쓰는 문자열

lower()는 이미 소문자인 ß를 그대로 두므로 첫 줄에서는 fußweg와 fussweg가 다릅니다. casefold()는 이 예제의 ß를 ss로 바꿔 두 비교값을 같게 만듭니다. 실제 확인은 둘째 줄처럼 변환한 두 값을 비교하면 됩니다.

한 글자가 두 글자로 바뀔 수 있으므로 표시에는 label의 원문을 쓰고, 같음 검사에는 folded_label을 쓰면 두 목적을 모두 충족할 수 있습니다. 표시 자체를 소문자로 바꾸려는 작업이라면 lower()를 선택하세요.

공백 처리와 언어별 비교는 별도 조건입니다

print("양끝 공백", " Report ".casefold() == "REPORT".casefold())
print("I와 ı", "I".casefold() == "ı".casefold())
양끝 공백 False
I와 ı False

첫 비교에서는 ' report '에 양끝 공백이 남습니다. 입력 계약에서 양끝 공백을 무시하기로 했다면 비교 키를 만들 때 strip()을 함께 적용할 수 있습니다. 둘째 비교에서 I는 i로 바뀌고 점 없는 ı는 그대로입니다. 특정 언어의 대소문자 규칙이 요구되면 그 비교 규칙을 별도로 정해야 합니다.

코드 포인트의 조합이나 호환 문자까지 같게 볼지는 NFC와 NFKC 정규화의 차이를 보고 별도로 결정할 수 있습니다.

가상 입력의 각 코드 블록은 Windows 11의 CPython 3.14.3에서 실행했습니다. 대소문자 구별 없는 비교를 위한 변환과 lower()의 차이는 Python str.casefold 문서에서 확인할 수 있습니다.

이 카테고리의 다른 글

전체글 보기

댓글 남기기