2010-04-27 9 views
9

Ich musste die Chinesen aus einer Reihe von Strings heute strippen und war auf der Suche nach einem einfachen Python Regex. Irgendwelche Vorschläge?Finden Sie alle chinesischen Text in einer Zeichenfolge mit Python und Regex

+0

Sind Sie sicher, dass Sie Chinesisch entfernen möchten, oder möchten Sie wirklich alles entfernen, das nicht Latein ist? – SingleNegationElimination

+0

Warum ist es notwendig (oder nützlich), chinesische Zeichen aus einer Zeichenfolge zu entfernen, anstatt sie zu übersetzen? –

Antwort

22

Die kurze, aber relativ umfassende Antwort für enge Unicode von Python baut (mit Ausnahme von ordinals> 65535, die nur in engen Unicode-Versionen über Ersatzpaare dargestellt werden können):

Der Code zum Erstellen der RE, und wenn Sie chinesische Zeichen in der supplementary plane für Wide Builds erkennen müssen:

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

Das ist im Internet gefunden und es scheint perfekt zu funktionieren.

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

Ausgang:

美国 
朋友 
+0

Dies funktioniert nicht für alle chinesischen Zeichen, da einige Ersatzpaare sind, wenn sie UTF-16-kodiert sind. (Da Sie \ u4e00 und \ u9fff verwenden, sieht es so aus, als wären Sie UTF-16) –

+0

@Stephen: Das stimmt, aber die chinesischen Schriftzeichen außerhalb der BMP sind weitgehend Varianten/historische Formen, die in der modernen chinesischen Schrift nicht verwendet werden Es ist unwahrscheinlich, dass es eine Rolle spielt. Andere mögliche Probleme, die Prairiedogg wahrscheinlich nicht interessiert: Wie Sie im obigen Beispiel sehen können, extrahiert der Code Han-Zeichen, ignoriert jedoch chinesische Interpunktion; Es ignoriert auch verschiedene andere chinesische Symbole (eingekreiste Zeichen usw.). und es wird seltsame und schreckliche Dinge zu japanischem Text tun. – Porculus

+0

Während ich meinen Datensatz durcharbeite, denke ich, dass TokenMacGuy korrekt ist - ich möchte wirklich alles entfernen, was nicht lateinisch ist. – Prairiedogg

Verwandte Themen