HOWTO · Python
Python의 문자열에서 특수 문자 제거
이 자습서에서는 Python의 문자열에서 모든 특수 문자를 제거하는 방법을 설명합니다.
이 페이지의 내용
Python 문자열에서 문자를 제거하려면 먼저 어떤 문자를 남길지 정하세요. str.isalnum()을 사용하는 컴프리헨션이나 filter()는 유니코드 문자와 숫자를 남기고, 정규식은 공백을 유지하도록 설정할 수 있으며, str.translate()는 지정한 문자 집합을 대상으로 삼을 수 있습니다. 아래 예제에서는 각 규칙이 분명히 드러나도록 "Hey! What's up bro?"를 사용합니다. 각 코드 예제는 입력을 직접 정의하고 변환된 문자열을 출력하므로, 원하는 방법을 골라 따로 실행할 수 있습니다.
특수 문자의 기준 정하기
‘특수 문자’에 통일된 기준은 없습니다. 문장 부호만을 뜻할 수도 있고, 문장 부호와 공백을 함께 뜻할 수도 있으며, ASCII 문자와 숫자가 아닌 모든 문자를 가리킬 수도 있습니다. 정제된 문자열의 용도에 맞춰 기준을 정하세요. 표시 이름에는 공백이 필요할 수 있지만, 짧은 식별자에는 필요하지 않을 수 있습니다.
Python 문자열은 유니코드를 사용합니다. str.isalnum()은 유니코드 문자와 숫자를 인식하므로 é나 中 같은 문자도 남길 수 있습니다. 반면 [a-zA-Z0-9]로 작성한 패턴은 ASCII 문자와 숫자에만 해당합니다. 따라서 각 방법에 동일한 문자 기준을 적용하지 않으면 결과가 서로 달라집니다.
컴프리헨션으로 영숫자가 아닌 문자 제거하기
결과에 문자와 숫자만 남기려면 str.isalnum()을 사용하는 문자열 컴프리헨션을 쓰세요. str.join()은 남은 문자들을 새 문자열로 합칩니다. 이 규칙은 공백과 문장 부호도 제거합니다.
original = "Hey! What's up bro?"
cleaned = "".join(char for char in original if char.isalnum())
print(cleaned)
HeyWhatsupbro
이 조건식은 ASCII 문자뿐 아니라 유니코드 문자와 숫자도 남깁니다. 예를 들어 é 같은 문자는 유지되지만 공백, 아포스트로피, 문장 부호는 제외됩니다.
filter()로 문자 걸러내기
내장 함수인 filter()는 각 문자에 조건 함수를 적용하고, 조건이 참인 문자들을 담은 반복자를 반환합니다. 여기에 str.isalnum을 전달하면 컴프리헨션과 마찬가지로 같은 유니코드 문자와 숫자를 남깁니다. str.join()을 사용하면 반복자의 문자들을 다시 문자열로 합칠 수 있습니다. 컴프리헨션과 마찬가지로 공백은 제거됩니다.
original = "Hey! What's up bro?"
kept = filter(str.isalnum, original)
cleaned = "".join(kept)
print(cleaned)
HeyWhatsupbro
조건 함수를 재사용하거나 이미 정의해 둔 경우에는 filter()를 사용하세요. 이처럼 간단한 문자열 변환에서는 컴프리헨션이 같은 규칙을 더 간결하게 표현합니다.
str.translate()로 지정한 문자 집합 제거하기
제거할 문자를 알고 있고 나머지는 모두 유지하려면 str.translate()를 사용하세요. str.maketrans()는 선택한 각 문자를 제거하도록 변환 테이블을 만듭니다. 아래 문자 집합은 흔한 ASCII 문장 부호를 제거합니다. 공백과 목록에 없는 문자는 그대로 남습니다.
original = "Hey! What's up bro?"
characters_to_remove = "!@#$%^&*()_-+=<>,./?;:'\"[]{}\\|`~"
table = str.maketrans("", "", characters_to_remove)
cleaned = original.translate(table)
print(cleaned)
Hey Whats up bro
입력에 맞게 characters_to_remove에 문자를 추가하거나 삭제하세요. 이 방법은 문장 부호로 볼 수 있는 모든 문자를 제거하지 않습니다. 목록에 없는 문자는 비ASCII 문장 부호를 포함해 결과에 그대로 남습니다.
정규식으로 문자 제거하기
re.sub()은 패턴과 일치하는 모든 문자를 바꿉니다. 이 패턴은 ASCII 문자와 숫자만 남기므로 공백과 문장 부호가 모두 제거됩니다. 대표 이미지는 이와 같은 규칙을 보여줍니다. 문자와 숫자 범위는 ASCII에 한정되므로, 텍스트에 그 범위 밖의 문자가 있다면 유니코드를 고려한 규칙을 사용하세요.
import re
original = "Hey! What's up bro?"
pattern = r"[^a-zA-Z0-9]"
cleaned = re.sub(pattern, "", original)
print(cleaned)
HeyWhatsupbro
제공된 런타임 증거에는 이 예제를 실행했을 때 위에 표시된 출력이 나온 것으로 기록되어 있습니다. 공백을 유지하려면 허용 문자 집합에 \s를 추가해 r"[^a-zA-Z0-9\s]"처럼 작성하세요. Python 정규식의 문자 클래스와 플래그로 다른 규칙도 표현할 수 있지만, 선택한 패턴이 데이터의 언어와 문자에 맞는지 확인하세요.
map()과 람다로 문자 변환하기
map()은 각 문자에 함수를 적용하고 반복자를 반환합니다. 람다 함수는 문자가 유니코드 문자나 숫자 또는 공백이면 원래 문자를 반환하고, 그 외에는 빈 문자열을 반환하도록 만들 수 있습니다. 반환된 결과를 합치면 정제된 문자열이 만들어집니다. 이 규칙은 탭과 줄바꿈을 포함한 공백을 유지합니다.
original = "Hey! What's up bro?"
cleaned = "".join(
map(lambda char: char if char.isalnum() or char.isspace() else "", original)
)
print(cleaned)
Hey Whats up bro
단순히 포함 여부를 판단하는 조건보다 복잡한 변환 로직이 필요할 때 사용할 수 있는 문자 단위 처리 방법입니다. 문자와 숫자만 남기는 규칙이라면 대신 컴프리헨션이나 filter() 예제를 사용하세요.
문자 규칙에 맞는 방법 선택하기
- 유니코드 문자와 숫자를 남기고 공백을 제거하는 간단하고 읽기 쉬운 규칙에는
str.isalnum()을 사용하는 컴프리헨션을 선택하세요. - 재사용할 조건 함수를 전달하려면
filter()를 선택하세요. 예제에서는str.isalnum()과 같은 규칙을 적용합니다. - 공백과 목록에 없는 문장 부호를 포함해 나머지 문자를 모두 유지하면서 지정한 문자 집합만 제거하려면
str.translate()를 선택하세요. - 제거하거나 유지할 문자를 패턴으로 표현하려면
re.sub()를 선택하세요. 예제의 ASCII 범위는 공백을 제거합니다. 유니코드 텍스트를 처리하거나 공백을 유지하려면 패턴을 조정하세요. - 문자마다 다른 변환 로직을 적용하려면 람다와 함께
map()을 선택하세요. 예제는 유니코드 문자와 숫자, 공백을 유지합니다.
이름이나 자연어 텍스트를 정제하기 전에 악센트, 비라틴 문자, 공백을 어떻게 처리할지 정하세요. 식별자나 프로토콜에서 요구하는 입력이라면 ‘특수 문자’라는 포괄적인 개념에 기대지 말고 문서에 명시된 문자 집합을 정확히 따르세요.