2012-05-30 24 views
14

Estoy aprendiendo acerca de las expresiones regulares (regex) para inglés y aunque algunos de los conceptos parecen aplicarse a otros idiomas como el japonés, siento que muchos otros no lo harían. Por ejemplo, un uso común de regex es encontrar si una palabra tiene caracteres no alfanuméricos. No veo cómo esta técnica, así como otras, funcionarían para los japoneses, ya que no solo existen tres sistemas de escritura, sino que los kanji también son muy complejos y abarcan un rango mucho mayor que los caracteres alfanuméricos. Agradecería cualquier información sobre este tema, así como áreas en las que investigar más ya que tengo muy poco conocimiento sobre el tema, aunque he tomado muchos cursos de japonés. Si es posible, me gustaría que sus respuestas usen python y Java, ya que esos son los idiomas con los que me siento cómodo. Gracias por tu ayuda.Expresiones regulares (regex) en japonés

+0

mayoría de las implementaciones de expresiones regulares compatibles con Unicode. Qué tipo de expresiones regulares para escribir es una pregunta separada. – SLaks

+0

@ Something Jones: Puede aplicar caracteres japoneses utilizando el valor hexadecimal de Unicode. mi.g: \ uXXXX en el que XXXX es el valor del carácter Unicode. – jaselg

+0

Algo que puede ayudar: http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml. Tenga en cuenta que no separa el glifo chino del glifo japonés del mismo carácter. – nhahtdh

Respuesta

10

Las expresiones regulares de Python ofrecen soporte limitado para las características Unicode. Java es mejor, particularmente Java 7.

Java admite categorías Unicode. Por ejemplo, \p{L} (y su abreviatura, \pL) coincide con cualquier letra en cualquier idioma. Esto incluye caracteres ideográficos japoneses.

Java 7 admite scripts Unicode, incluidos los scripts Hiragana, Katakana, Han y latinos de los que generalmente se compone el texto en japonés. Puede hacer coincidir cualquier carácter en uno de estos scripts utilizando \p{Han}, \p{Hiragana}, \p{Katakana} y \p{Latin}. Puede combinarlos en una clase de personaje como [\p{Han}\p{Hiragana}\p{Katakana}]. Puede utilizar una mayúscula P (como en, \P{Han}) para que coincida con cualquier carácter, excepto los del script Han.

Java 7 admite bloques Unicode. A menos que ejecute su código en Android (donde los scripts no están disponibles), generalmente debe evitar los bloques, ya que son menos útiles y precisos que los scripts Unicode. Hay una variedad de bloques relacionados con el texto en japonés, incluyendo \p{InHiragana}, \p{InKatakana}, \p{InCJK_Unified_Ideographs}, \p{InCJK_Symbols_and_Punctuation}, etc.

Tanto Java y Python puede hacer referencia a los puntos de código individuales utilizando \uFFFF, donde FFFF es cualquier número headecimal de cuatro dígitos. Java 7 puede hacer referencia a cualquier punto de código Unicode, incluidos los que están más allá del plano multilingüe básico, utilizando, p. \x{10FFFF}. Las expresiones regulares de Python no son compatibles con Unicode de 21 bits, pero sí lo hacen las cadenas de Python, por lo que puede insertar un punto de código en una expresión regular usando, p. \U0010FFFF (mayúscula U seguida de ocho dígitos hexadecimales).

El Java 7 (?U) o UNICODE_CHARACTER_CLASS bandera hace taquigrafías de clase de caracteres como \w y \d Unicode en cuenta, por lo que coincidirá con caracteres ideográficos japoneses, etc. (pero tenga en cuenta que \d todavía no coincidirá con kanji de números como 一二 三四) . Python 3 hace que las clases abreviadas sean conocidas por Unicode de forma predeterminada. En Python 2, las clases abreviadas son conscientes de Unicode cuando se utiliza el indicador re.UNICODE o re.U.

Tiene razón en que no todas las ideas regex se transmiten igual de bien a todas las secuencias de comandos. Algunas cosas (como el uso de mayúsculas y minúsculas) simplemente no tienen sentido con el texto en japonés.

+0

Es muy probable que el segundo párrafo sea incorrecto según la documentación de Java 7. ** ¿Has probado? ** El resto no lo puedo probar ahora. – nhahtdh

+0

Python versión 3 regex admite Unicode más o menos de la misma forma que Java 7 lo hace para la clase Pattern: http://docs.python.org/py3k/library/re.html – nhahtdh

+0

@nhahtdh, sus comentarios no son útiles. Sí, Java admite scripts Unicode (descritos en mi segundo párrafo) y no requiere el prefijo "Is" para usarlos (recomiendo no usar "Is", ya que eso lo hace menos portátil). Y no, Python 3 no tiene casi el mismo soporte para funciones Unicode en su sintaxis de expresiones regulares que Java (sin scripts, categorías, bloques, etc. de Unicode). – slevithan

3

Las clases de caracteres de Java hacen algo como lo que estás buscando. Ellos son los que comienzan con \ p here.

+0

@nhahtdh: Haga una pregunta sobre algo en particular para probar. – Ashe

+0

Acabo de descubrir por qué me sale falso cuando ejecuto este código: http://ideone.com/p3P9b en mi computadora. El comando de compilación debe ser 'javac -encoding utf8 ' para que funcione correctamente. – nhahtdh

6

Para Python

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import re 

kanji = u'漢字' 
hiragana = u'ひらがな' 
katakana = u'カタカナ' 
str = kanji + hiragana + katakana 

#Match Kanji 
regex = u'[\u4E00-\u9FFF]+' # == u'[一-龠々]+' 
match = re.search(regex, str, re.U) 
print match.group().encode('utf-8') #=> 漢字 

#Match Hiragana 
regex = u'[\u3040-\u309Fー]+' # == u'[ぁ-んー]+' 
match = re.search(regex, str, re.U) 
print match.group().encode('utf-8') #=> ひらがな 

#Match Katakana 
regex = u'[\u30A0-\u30FF]+' # == u'[ァ-ヾ]+' 
match = re.search(regex, str, re.U) 
print match.group().encode('utf-8') #=>カタカナ 
Cuestiones relacionadas