Python String/Unicode translate() 함수
Python 2008. 9. 29. 15:53문자(열) 교체 함수 str.translate(), unicode.translate() 사용법
우선 일반 문자열(unicode object 아닌 문자열)부터.
str.translate(tbl,del)두개의 인자를 받는다. tbl은 0~255의 ASCII문자를 각각 대체할 문자로 만든 매핑테이블이다. 말이 테이블이지 길이 256짜리 문자열이다. 즉, ASCII코드 32인 문자(스페이스)는 매핑테이블의 32번째 글자로 바꿔주는 것이다. 따라서 tbl은 꼭 길이 256인 문자열(str object)여야 한다.
string.translate(s, tbl, del) == s.translate(tbl, del) 이다.
바로 예제 ㄱㄱㅅ
- #원본 문자열. \n는 개행, \t는 탭문자, \b는 앞글자를 지운다.
tstr = """가나다\n\t\b123 4\b5\b6\babcd efgh (789) -_-+ 라마바 사2사2 文字"""
# 원본 문자열을 프린트
print "original:", tstr
# 간단한 translate. 각 바이트의 첫 비트로 translate
tbl = ""
for cc in range(256):
if cc < 128: tbl += "0"
else: tbl += "1"
print "tbl =", tbl
print "initial bit:", tstr.translate(tbl)
컨트롤 캐릭터를 지우는데 활용해 보기.
- # ascii code값이 32미만(컨트롤캐릭터)이면 32(space)로 바꾸는 매핑테이블. \n \r \t \b 이런거 다 공백으로 바뀐다.
TRMAP_ASCII_CTRL2SPACE = "".join([chr(max(32,cc)) for cc in range(256)])
print "ctrl to space:", tstr.translate(TRMAP_ASCII_CTRL2SPACE)
# 컨트롤 캐릭터를 공백으로 바꾸고 홀수는 지우는 변환.
print "ctrl to space deleting '13579':", tstr.translate(TRMAP_ASCII_CTRL2SPACE, "13579")
컨트롤 캐릭터를 공백으로 바꾸지 않고 del인자를 써서 삭제할 수도 있다.
- # 아무것도 바꾸지 않는 매핑 테이블
TRMAP_NOCHANGE = "".join([chr(cc) for cc in range(256)])
# 컨트롤 캐릭터만 삭제
ASCII_CTRLCHARS = "".join([chr(cc) for cc in range(32)])
print "delete ctrl chars:", tstr.translate(TRMAP_NOCHANGE, ASCII_CTRLCHARS)
character code가 127이하인 문자를 삭제하는 del인자를 써서 한글, 한자, 일어 등 멀티바이트문자만 남길 수도 있다. 간단하므로 예제 코드 생략.
다음은 unicode.translate()
이건 사용법은 비슷하지만 두가지 차이점이 있다. 첫째, 매핑 테이블은 진짜-_-테이블이라는것. 둘째, del 인자를 주지 않는다는 것.
매핑테이블은 dict로 정의한다. 그래서 메모리를 크게 잡아먹을 수도 있다. 그래도 함수 수행자체는 뎁따 빠르므로 활용가치가 높다.
매핑 테이블을 만드는 유용한 함수를 하나 같이 소개한다.
__builtins__.zip(seq1, seq2, ... ) 함수는 리스트를 반환하는데, seq1, seq2, ... 에서 순서대로 하나씩 꺼내서 tuple로 묶은 리스트를 반환한다.
즉, zip([1,2,3], ('a', 'b', 'c')) 는 [(1,'a'), (2,'b'), (3,'c')] 를 리턴한다.
dict object는 zip의 결과를 초기화 인수로 받을 수 있도록 만들어져 있으므로, 이걸 활용하면 unicode translate 맵핑테이블을 쉽게 작성할 수 있다.
한글이 나타나는 unicode range가 정해져 있으므로, 한글을 공백으로 바꿔버리는 예제를 만들어 보자.
- # 위에서 사용한 테스트 문자열을 unicode로 바꾼다.
utstr = unicode(tstr, "utf8")
# unicode에서 한글이 나타나는 영역이다.
__unicode_range_hangul = range(0xac00, 0xd7a4)
__unicode_range_hangul_jamo1 = range(0x1100, 0x11fa)
__unicode_range_hangul_jamo2 = range(0x3131, 0x318f)
__unicode_range_korean = __unicode_range_hangul + __unicode_range_hangul_jamo1 + __unicode_range_hangul_jamo2
__build_mapping_range2char = lambda r,uc: zip(r, uc * len(r))
# 한글을 모두 공백으로 바꿔버리는 매핑테이블
trmap_korean = dict(__build_mapping_range2char(__unicode_range_korean, u" "))
print "utstr:", utstr
print "utstr without Korean chars:", utstr.translate(trmap_korean)
삭제를 하려면 매핑 테이블에서 빈 문자열( u"" )을 주면 된다. __build_mapping_range2char() 람다함수를 조금 고치면 된다. 예제 생략.
이 글은 스프링노트에서 작성되었습니다.
근데 코드 영역이 이상하게 붙여져서 티스토리 편집기로 다시 수정했습니다ㅡ_ㅡ 젝일;;
'Python' 카테고리의 다른 글
python 디버그: line 번호 찍기 (0) | 2008.08.01 |
---|---|
python 키 입력 받는 함수; input, raw_input, getpass (0) | 2008.07.13 |
python object의 멤버 attribute를 런타임에 생성하기 (0) | 2008.03.20 |
Google pagerank를 알아내는 python코드 (1) | 2008.01.26 |
Python Built-in 가지고 놀기 (0) | 2007.08.30 |