2010-04-27 37 views
9

Tôi cần phải tách tiếng Trung ra khỏi một chuỗi các chuỗi ngày hôm nay và đang tìm kiếm một regex Python đơn giản. Bất kỳ đề xuất?Tìm tất cả văn bản tiếng Trung trong một chuỗi bằng Python và Regex

+0

Bạn có chắc chắn muốn xóa tiếng Trung hoặc bạn có thực sự muốn xóa mọi thứ không phải tiếng Latinh không? – SingleNegationElimination

+0

Tại sao cần thiết (hoặc hữu ích) để xóa ký tự Trung Quốc khỏi chuỗi thay vì dịch chúng? –

Trả lời

22

Câu trả lời ngắn, nhưng tương đối toàn diện cho hẹp Unicode xây dựng của python (trừ ordinals> 65535 mà chỉ có thể được đại diện trong hẹp Unicode được xây dựng thông qua cặp thay thế):

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

Mã để xây dựng RE và nếu bạn cần phát hiện ký tự Trung Quốc trong các supplementary plane để tạo hình rộng:

# -*- 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

Tìm thấy điều này trên internets và nó có vẻ hoạt động hoàn hảo.

#!/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 

Output:

美国 
朋友 
+0

Điều này sẽ không hoạt động đối với tất cả các ký tự Trung Quốc vì một số là cặp thay thế khi mã hóa UTF-16. (Vì bạn đang sử dụng \ u4e00 và \ u9fff có vẻ như bạn là UTF-16) –

+0

@Stephen: điều này là đúng, nhưng các ký tự Trung Quốc bên ngoài BMP phần lớn là biến thể/hình thức lịch sử không được sử dụng trong văn bản hiện đại của Trung Quốc, vì vậy nó không quan trọng. Các vấn đề tiềm năng khác mà Prairiedogg có thể không quan tâm: như bạn có thể thấy trong ví dụ trên, mã sẽ trích xuất các ký tự Hán nhưng bỏ qua dấu câu Trung Quốc; nó cũng sẽ bỏ qua các biểu tượng khác của Trung Quốc (các ký tự được khoanh tròn, vv); và nó sẽ làm những điều kỳ lạ và khủng khiếp với văn bản tiếng Nhật. – Porculus

+0

Thực ra khi tôi đang làm việc thông qua bộ dữ liệu của mình, tôi nghĩ rằng TokenMacGuy là chính xác - Tôi thực sự muốn xóa mọi thứ không phải là tiếng Latinh. – Prairiedogg

Các vấn đề liên quan