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) 이다.

 

바로 예제 ㄱㄱㅅ

 

  1. #원본 문자열. \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)

 

컨트롤 캐릭터를 지우는데 활용해 보기.

 

  1. # 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인자를 써서 삭제할 수도 있다.

  1. # 아무것도 바꾸지 않는 매핑 테이블
    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가 정해져 있으므로, 한글을 공백으로 바꿔버리는 예제를 만들어 보자.

  1. # 위에서 사용한 테스트 문자열을 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() 람다함수를 조금 고치면 된다. 예제 생략.

 

이 글은 스프링노트에서 작성되었습니다.

근데 코드 영역이 이상하게 붙여져서 티스토리 편집기로 다시 수정했습니다ㅡ_ㅡ 젝일;;

: