2010-04-27 3 views
9

문자열 묶음에서 중국어를 제거하고 간단한 파이썬 정규식을 찾고있었습니다. 어떤 제안?Python과 Regex를 사용하여 문자열의 모든 중국어 텍스트 찾기

+0

정말 중국어를 제거 하시겠습니까, 아니면 정말로 라틴어가 아닌 모든 것을 제거 하시겠습니까? – SingleNegationElimination

+0

중국어 문자를 번역하는 대신 문자열에서 제거해야하는 이유는 무엇입니까 (유용합니까)? –

답변

22

(단지 좁은 유니 코드로 표현할 수 65535 게이트 쌍을 통해 구축> 제외 서수)

RE = re.compile(u'[⺀-⺙⺛-⻳⼀-⿕々〇〡-〩〸-〺〻㐀-䶵一-鿃豈-鶴侮-頻並-龎]', re.UNICODE) 
nochinese = RE.sub('', mystring) 

RE 빌드를위한 코드 및 넓은 빌드의 경우 supplementary plane에서 중국어 문자를 감지해야하는 경우 :

# -*- coding: utf-8 -*- 
import re 

LHan = [[0x2E80, 0x2E99], # Han # So [26] CJK RADICAL REPEAT, CJK RADICAL RAP 
     [0x2E9B, 0x2EF3], # Han # So [89] CJK RADICAL CHOKE, CJK RADICAL C-SIMPLIFIED TURTLE 
     [0x2F00, 0x2FD5], # Han # So [214] KANGXI RADICAL ONE, KANGXI RADICAL FLUTE 
     0x3005,    # Han # Lm  IDEOGRAPHIC ITERATION MARK 
     0x3007,    # Han # Nl  IDEOGRAPHIC NUMBER ZERO 
     [0x3021, 0x3029], # Han # Nl [9] HANGZHOU NUMERAL ONE, HANGZHOU NUMERAL NINE 
     [0x3038, 0x303A], # Han # Nl [3] HANGZHOU NUMERAL TEN, HANGZHOU NUMERAL THIRTY 
     0x303B,    # Han # Lm  VERTICAL IDEOGRAPHIC ITERATION MARK 
     [0x3400, 0x4DB5], # Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400, CJK UNIFIED IDEOGRAPH-4DB5 
     [0x4E00, 0x9FC3], # Han # Lo [20932] CJK UNIFIED IDEOGRAPH-4E00, CJK UNIFIED IDEOGRAPH-9FC3 
     [0xF900, 0xFA2D], # Han # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900, CJK COMPATIBILITY IDEOGRAPH-FA2D 
     [0xFA30, 0xFA6A], # Han # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30, CJK COMPATIBILITY IDEOGRAPH-FA6A 
     [0xFA70, 0xFAD9], # Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70, CJK COMPATIBILITY IDEOGRAPH-FAD9 
     [0x20000, 0x2A6D6], # Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000, CJK UNIFIED IDEOGRAPH-2A6D6 
     [0x2F800, 0x2FA1D]] # Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800, CJK COMPATIBILITY IDEOGRAPH-2FA1D 

def build_re(): 
    L = [] 
    for i in LHan: 
     if isinstance(i, list): 
      f, t = i 
      try: 
       f = unichr(f) 
       t = unichr(t) 
       L.append('%s-%s' % (f, t)) 
      except: 
       pass # A narrow python build, so can't use chars > 65535 without surrogate pairs! 

     else: 
      try: 
       L.append(unichr(i)) 
      except: 
       pass 

    RE = '[%s]' % ''.join(L) 
    print 'RE:', RE.encode('utf-8') 
    return re.compile(RE, re.UNICODE) 

RE = build_re() 
print RE.sub('', u'美国').encode('utf-8') 
print RE.sub('', u'blah').encode('utf-8') 
18

인터넷에서 이것을 알아 냈고 완벽하게 작동하는 것 같습니다.

#!/usr/bin/env python 
# -*- encoding: utf8 -*- 


import re 

sample = u'I am from 美国。We should be friends. 朋友。' 
for n in re.findall(ur'[\u4e00-\u9fff]+',sample): 
    print n 

출력 : 좁은 유니 코드 짧고 비교적 광범위한 않음 파이썬 빌드

美国 
朋友 
+0

일부 중국어 문자는 UTF-16으로 인코딩 될 때 서로 게이트 쌍이므로 모든 중국어 문자에 대해 작동하지 않습니다. (당신이 \ u4e00을 사용하고 있기 때문에 UTF-16 인 것처럼 보입니다.) –

+0

@Stephen : 이것은 사실이지만, BMP 외부의 한자는 현대의 중국어 글쓰기에서 사용되지 않는 크게 변형 된/역사적인 형태입니다. 그건 중요하지 않을거야. Prairiedogg가 신경 쓰지 않는 다른 잠재적 인 문제 : 위의 예에서 볼 수 있듯이 코드는 한자를 추출하지만 중국어 구두점은 무시합니다. 그것은 또한 다양한 다른 중국어 기호 (원 문자 등)를 무시합니다; 그리고 그것은 일본어 본문에 이상하고 끔찍한 일을 할 것입니다. – Porculus

+0

실제로 데이터 세트를 작업하면서 TokenMacGuy가 정확하다고 생각합니다. 저는 라틴어가 아닌 모든 것을 제거하려고합니다. – Prairiedogg

관련 문제