regex - solo - probar expresiones regulares
Expresiones regulares(regex) en japonés (3)
Estoy aprendiendo acerca de las expresiones regulares (expresiones regulares) para el 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 pocos conocimientos 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.
Las clases de caracteres de Java hacen algo como lo que estás buscando. Ellos son los que comienzan con / p aquí .
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 usando /p{Han}
, /p{Hiragana}
, /p{Katakana}
y /p{Latin}
. Puedes combinarlos en una clase de personaje como [/p{Han}/p{Hiragana}/p{Katakana}]
. Puede usar una P
mayúscula (como en, /P{Han}
) para que coincida con cualquier carácter excepto aquellos en la secuencia de comandos 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 japonés, incluidos /p{InHiragana}
, /p{InKatakana}
, /p{InCJK_Unified_Ideographs}
, /p{InCJK_Symbols_and_Punctuation}
, etc.
Tanto Java como Python pueden referirse a puntos de código individuales usando /uFFFF
, donde FFFF
es cualquier número de cuatro dígitos headecimal. 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, por ejemplo, /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 utilizando, por ejemplo, /U0010FFFF
( U
mayúscula seguida de ocho dígitos hexadecimales).
El indicador Java 7 (?U)
o UNICODE_CHARACTER_CLASS
hace que los caracteres abreviados de clase de caracteres como /w
y /d
Unicode sean conscientes, por lo que coincidirán con los caracteres ideográficos japoneses, etc. (pero tenga en cuenta que /d
aún no coincidirá con kanji para 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 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.
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'') #=>カタカナ