Necesitaba quitar a los chinos de un montón de cadenas hoy y estaba buscando una expresión regular de Python simple. ¿Alguna sugerencia?Buscar todo el texto chino en una cadena usando Python y Regex
Respuesta
La respuesta corta, pero relativamente completa para estrecha Unicode construye de pitón (con exclusión de los ordinales> 65535 que sólo puede ser representado en estrecha Unicode construye a través de pares suplentes):
RE = re.compile(u'[⺀-⺙⺛-⻳⼀-⿕々〇〡-〩〸-〺〻㐀-䶵一-鿃豈-鶴侮-頻並-龎]', re.UNICODE)
nochinese = RE.sub('', mystring)
El código para generar el RE, y si necesita detectar caracteres chinos en el supplementary plane para compilaciones amplias:
# -*- 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')
Encontré esto en los internets y parece funcionar perfectamente.
#!/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
de salida:
美国
朋友
Esto no funcionará para todos los caracteres chinos ya que algunos son pares sustituidos cuando se codifica UTF-16. (Dado que está utilizando \ u4e00 y \ u9fff parece que es UTF-16) –
@Stephen: esto es cierto, pero los caracteres chinos fuera de BMP son en gran parte variantes/formas históricas que no se usan en la escritura china moderna, por lo tanto es poco probable que importe. Otros problemas potenciales que a Prairiedogg probablemente no le interesan: como puede ver en el ejemplo anterior, el código está extrayendo caracteres Han pero está ignorando la puntuación china; también ignorará otros símbolos chinos (caracteres circulares, etc.); y hará cosas extrañas y terribles al texto japonés. – Porculus
En realidad, mientras estoy trabajando en mi conjunto de datos, estoy pensando que TokenMacGuy es correcto, realmente quiero quitar todo lo que no sea latino. – Prairiedogg
- 1. buscar todo el texto antes de usar regex
- 2. Buscar subcadena en una cadena usando C#
- 3. regex para buscar una cadena entre corchetes []
- 4. Truncar texto en chino
- 5. Eliminar todo entre paréntesis java usando regex
- 6. Buscar texto en una cadena con C#
- 7. Regex + Eliminar todo el texto antes del partido
- 8. Separación de cadenas en Python usando regex
- 9. buscar y reemplazar con ruby regex
- 10. Reemplazar todo entre [y] en regex java
- 11. Cómo extraer el contenido de corchetes en una cadena de texto en C# usando Regex
- 12. Múltiples sustituciones de números en cadena usando regex python
- 13. Buscar y obtener una línea en Python
- 14. REGEX: Seleccione todo NO igual a una determinada cadena
- 15. Buscar y eliminar todo en mongo/mongoid
- 16. Python expresión regular para buscar una cadena entre comillas dobles dentro de una cadena
- 17. Usando Eclipse buscar y reemplazar todo para intercambiar argumentos
- 18. Cómo convertir una cadena de pinyin a chino en C#
- 19. Coincidir cadena dinámica usando regex
- 20. Regex para buscar una palabra en una cadena en Visual Studio
- 21. Cómo filtrar chino (SOLO chino)
- 22. Buscar cadena en archivo de texto C
- 23. Reconociendo texto como chino simplificado frente a chino tradicional
- 24. cómo usar el carácter chino y japonés como una cadena en java?
- 25. ¿Cómo buscar una cadena en otra cadena?
- 26. PHP: elimina el espacio extra de una cadena usando regex
- 27. ¿Cómo marcar todo el texto CJK en un documento?
- 28. Python Regex para hacer coincidir una cadena como un patrón y devolver el número
- 29. Python no lee todo el archivo de texto
- 30. ¿Cómo buscar texto rodeado de comillas dobles con RegEx?
¿Estás seguro de que deseas eliminar chino o realmente quieres eliminar todo lo que no sea latino? – SingleNegationElimination
¿Por qué sería necesario (o útil) eliminar caracteres chinos de una cadena en lugar de traducirlos? –