파이썬 한자, 로마자를 어떻게 골라낼 수 있을까요?

조회수 2282회

isalnum과 같이 간편하게 문자열에서 한자와 β 같은 로마자를 제외하는 방법을 알고 싶습니다.

예시
'가나다-aβbc-123 김家네 김밥' => '가나다 a bc 123 김네 김밥'
또는
'가나다-aβbc-123 김家네 김밥' => '가나다 a bc 123 김 네 김밥'
또는
'가나다-aβbc-123 김家네 김밥' => '가나다abc123김네김밥'

문장 또는 문구에서 한글, 영어, 숫자를 추출하려고 했는데, 처음에는 filter와 isalnum 을 이용해서 추출해보려 했습니다.

그런데 특수문자로 분류되는 줄 알았던 한자와 로마자 모두 True를 반환하고 있어 헤메고 있습니다.

2 답변

  • 좋아요

    0

    싫어요
    채택 취소하기
    import re
    a = '가나다-aβbc-123 김家네 김밥'
    t = re.sub('[^a-zA-Z0-9ㄱ-ㅣ가-힣]','',a)
    '가나다abc123김네김밥'
    
  • Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license()" for more information.
    >>> s = "가나다-aβbc-123 김家네 김밥"
    >>> import unicodedata
    >>> for c in s:
        print(c, unicodedata.name(c))
    
    
    가 HANGUL SYLLABLE GA
    나 HANGUL SYLLABLE NA
    다 HANGUL SYLLABLE DA
    - HYPHEN-MINUS
    a LATIN SMALL LETTER A
    β GREEK SMALL LETTER BETA
    b LATIN SMALL LETTER B
    c LATIN SMALL LETTER C
    - HYPHEN-MINUS
    1 DIGIT ONE
    2 DIGIT TWO
    3 DIGIT THREE
      SPACE
    김 HANGUL SYLLABLE GIM
    家 CJK UNIFIED IDEOGRAPH-5BB6
    네 HANGUL SYLLABLE NE
      SPACE
    김 HANGUL SYLLABLE GIM
    밥 HANGUL SYLLABLE BAB
    
    >>> for c in s:
        print(c, unicodedata.name(c), c.isalpha())
    
    
    가 HANGUL SYLLABLE GA True
    나 HANGUL SYLLABLE NA True
    다 HANGUL SYLLABLE DA True
    - HYPHEN-MINUS False
    a LATIN SMALL LETTER A True
    β GREEK SMALL LETTER BETA True
    b LATIN SMALL LETTER B True
    c LATIN SMALL LETTER C True
    - HYPHEN-MINUS False
    1 DIGIT ONE False
    2 DIGIT TWO False
    3 DIGIT THREE False
      SPACE False
    김 HANGUL SYLLABLE GIM True
    家 CJK UNIFIED IDEOGRAPH-5BB6 True
    네 HANGUL SYLLABLE NE True
      SPACE False
    김 HANGUL SYLLABLE GIM True
    밥 HANGUL SYLLABLE BAB True
    
    >>> s
    '가나다-aβbc-123 김家네 김밥'
    >>> def filterout_hanja_greek(s):
        r = ""
        for c in s:
            if not c.isalpha():
                r += c
                continue
            unicodename = unicodedata.name(c)
            if unicodename.startswith("GREEK") or unicodename.startswith("CJK"):
                continue
            r += c
        return r
    
    >>> filterout_hanja_greek(s)
    '가나다-abc-123 김네 김밥'
    >>> 
    

    unicodedata 를 이용하면, 문자의 유니코드 이름을 알아낼 수 있는데, 이 이름의 첫부분이 어떤 문자인지를 나타냅니다. 이를 이용하여, 특정 문자를 제거할 수 있습니다.


    한자를 한글로 바꾸어주거나 하는 기능을 가진 hanja 라는 패키지도 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)