2012-05-30 9 views
14

Sto imparando le espressioni regolari (regex) per l'inglese e sebbene alcuni concetti sembrino applicarsi ad altre lingue come il giapponese, mi sento come se molti altri non lo facessero. Ad esempio, un uso comune della regex è trovare se una parola ha caratteri non alfanumerici. Non vedo come questa tecnica e gli altri possano funzionare per il giapponese, poiché non ci sono solo tre sistemi di scrittura, ma i kanji sono anche molto complessi e si estendono su una gamma molto più ampia di quella dei caratteri alfanumerici. Gradirei qualsiasi informazione su questo argomento, nonché le aree in cui esaminare di più poichè ho pochissime conoscenze in materia, anche se ho seguito molti corsi di giapponese. Se possibile, mi piacerebbe che le tue risposte usassero python e Java in quanto quelle sono le lingue con le quali mi trovo a mio agio. Grazie per l'aiuto.Espressioni regolari (regex) in giapponese

+0

maggior parte delle implementazioni regex supporta Unicode. Che tipo di regex da scrivere è una domanda separata. – SLaks

+0

@Something Jones: è possibile applicare caratteri giapponesi utilizzando il valore esadecimale di Unicode. e.g: \ uXXXX in cui XXXX è il valore del carattere Unicode. – jaselg

+0

Qualcosa che può aiutare: http://www.rikai.com/library/kanjitables/kanji_codes.unicode.shtml. Si noti che non separa il glifo cinese dal glifo giapponese dello stesso personaggio. – nhahtdh

risposta

10

Le regex di Python offrono supporto limitato per le funzionalità Unicode. Java è migliore, in particolare Java 7.

Java supporta le categorie Unicode. Ad esempio, \p{L} (e la relativa stenografia, \pL) corrisponde a qualsiasi lettera in qualsiasi lingua. Questo include caratteri ideografici giapponesi.

Java 7 supporta gli script Unicode, inclusi gli script Hiragana, Katakana, Han e Latin di cui è composto il testo giapponese. È possibile abbinare qualsiasi carattere in uno di questi script utilizzando \p{Han}, \p{Hiragana}, \p{Katakana} e \p{Latin}. Puoi combinarli in una classe di caratteri come [\p{Han}\p{Hiragana}\p{Katakana}]. È possibile utilizzare un maiuscolo P (come in, \P{Han}) per corrispondere a qualsiasi carattere tranne quelli nello script Han.

Java 7 supporta blocchi Unicode. A meno che non si esegua il codice in Android (dove gli script non sono disponibili), in genere si dovrebbero evitare i blocchi, poiché sono meno utili e precisi degli script Unicode. Ci sono una serie di blocchi relativi al testo giapponese, tra cui \p{InHiragana}, \p{InKatakana}, \p{InCJK_Unified_Ideographs}, \p{InCJK_Symbols_and_Punctuation}, ecc

Sia Java e Python può fare riferimento a punti di codice individuali utilizzando \uFFFF, dove FFFF è un qualsiasi numero headecimal quattro cifre. Java 7 può fare riferimento a qualsiasi punto di codice Unicode, compresi quelli al di fuori del piano multilingue di base, utilizzando ad es. \x{10FFFF}. Le regex di Python non supportano l'Unicode a 21 bit, ma le stringhe di Python lo fanno, quindi puoi incorporare un punto di codice in un'espressione regolare usando ad es. \U0010FFFF (maiuscolo U seguito da otto cifre esadecimali).

Java 7 (?U) o UNICODE_CHARACTER_CLASS bandiera rende abbreviazioni classe personaggio come \w e \d Unicode a conoscenza, in modo che abbinerà i caratteri ideografici giapponesi, ecc (ma nota che \d sarà ancora non corrispondere kanji per i numeri come 一二 三四) . Python 3 rende le classi abbreviate Unicode per impostazione predefinita. In Python 2, le classi abbreviate sono compatibili con Unicode quando si utilizza il flag re.UNICODE o re.U.

Hai ragione che non tutte le idee regex si applicano altrettanto bene a tutti gli script. Alcune cose (come il case letterale) non hanno senso con il testo giapponese.

+0

È probabile che il secondo paragrafo sia errato in base alla documentazione di Java 7. ** Hai provato? ** Il resto non posso testare ora. – nhahtdh

+0

regex di Python versione 3 supporta Unicode più o meno allo stesso modo di Java 7 per la classe Pattern: http://docs.python.org/py3k/library/re.html – nhahtdh

+0

@nhahtdh, i tuoi commenti non sono utili. Sì, Java supporta gli script Unicode (descritti nel mio secondo paragrafo) e non richiede il prefisso "Is" per usarli (mi raccomando di non usare "Is", poiché ciò lo rende meno portabile). E no, Python 3 non ha quasi lo stesso supporto per le caratteristiche di Unicode nella sua sintassi regex come fa Java (niente script, categorie, blocchi, ecc. Unicode). – slevithan

3

Le classi di caratteri Java fanno qualcosa di simile a ciò che state cercando. Sono quelli che iniziano con \ p here.

+0

@nhahtdh: Per favore, fai una domanda su qualcosa in particolare da provare. – Ashe

+0

Ho appena scoperto perché ottengo false quando eseguo questo codice: http://ideone.com/p3P9b sul mio computer. Il comando Compilation dovrebbe essere 'javac -encoding utf8 ' perché funzioni correttamente. – nhahtdh

6

Per 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') #=>カタカナ