Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python) 문자열에서 인쇄 불가능한 문자 제거하는 방법

파이썬으로 텍스트를 처리하다 보면 눈에 보이지 않는 제어 문자나 인쇄할 수 없는(non-printable) 문자가 문자열에 섞여 있는 경우가 종종 있습니다. 이런 문자들은 출력 결과를 어지럽히거나 데이터 처리 과정에서 오류를 일으킬 수 있기 때문에 미리 제거해 두는 것이 좋습니다. 상황에 따라 두 가지 방법을 사용할 수 있습니다.

1. ASCII 문자만 있는 경우: string.printable로 필터링

문자열이 ASCII 문자로만 구성되어 있다면 string.printable을 활용하는 것이 가장 간단한 방법입니다. 이 상수에는 인쇄 가능한 모든 ASCII 문자가 담겨 있으므로, 여기에 포함되지 않는 문자를 걸러내면 됩니다.

>>> import string
>>> ''.join(filter(lambda x: x in string.printable, '\x01string'))
'string'

위 예제에서 0x01은 인쇄 가능한 문자가 아니기 때문에 결과에서 자동으로 제외됩니다. 참고로 파이썬 3의 filter()는 이터레이터를 반환하므로, 문자열로 변환하려면 ''.join()으로 감싸 주는 것이 좋습니다.

2. 유니코드까지 지원해야 하는 경우: unicodedata + 정규식

문자열에 한글 등 유니코드 문자가 포함될 수 있다면 unicodedata 모듈과 정규식(regex)을 함께 사용해야 합니다. 유니코드 범주 중 'Cc'(Control)에 해당하는 모든 제어 문자를 찾아 정규식 패턴으로 만든 뒤, 이를 빈 문자열로 치환하는 방식입니다.

import sys, unicodedata, re

# 모든 유니코드 문자 생성 (파이썬 2에서는 unichr, xrange 사용)
all_chars = (chr(i) for i in range(sys.maxunicode))
# 인쇄할 수 없는 제어 문자(Cc 범주)만 추출
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) == 'Cc')
# 해당 문자들로 정규식 패턴 생성
control_char_re = re.compile('[%s]' % re.escape(control_chars))

# 원본 문자열에서 제어 문자를 빈 문자열로 대체
def remove_control_chars(s):
return control_char_re.sub('', s)

print(remove_control_chars('\x00\x01String'))

실행 결과

String

앞부분의 널 문자(\x00)와 SOH(\x01)가 모두 제거되고 "String"만 깔끔하게 남은 것을 확인할 수 있습니다.

정리

  • ASCII 전용 문자열이라면 string.printable로 간단하게 필터링할 수 있습니다.
  • 유니코드 문자열이라면 unicodedata.category(c) == 'Cc' 조건으로 제어 문자를 찾아 정규식으로 제거하는 것이 가장 안전합니다.