2013-04-16 61 views
5

我在Python中有一個Unicode字符串。我正在尋找一種方法來確定字符串中是否有中文/日文字符。如果可能,最好能夠找到這些角色。有沒有辦法知道Unicode字符串是否包含Python中的任何中文/日文字符?

看起來這與語言檢測問題有點不同。我的字符串可以是英文和中文文本的混合。

我的代碼可以上網。

+0

可能的答案:http://stackoverflow.com/questions/6432926/how-can-i-relate-unicode-blocks-to-languages-scripts http://stackoverflow.com/questions/4545977/python-can -i-detect-unicode-string-language-code?rq = 1 – Patashu

回答

2

您可以使用此正則表達式[\u2E80-\u9FFF]來匹配CJK字符。

+3

這幾乎是,但不完全正確。根據官方的Unicode數據庫[Scripts.txt](http://www.unicode.org/Public/UNIDATA/Scripts.txt),漢字包括'2E80'的**子集**到'9FCC' ,以及'F900'到'FAD9'和'20000'到'2FA1D'。但子集有點複雜... – nneonneo

4

您可以使用Unicode腳本屬性來確定它們通常與哪些腳本關聯。

Python的unicodedata模塊,可悲的是,沒有這個屬性。但是,許多第三方模塊(例如unicodedata2unicodescript)確實具有此信息。您可以查詢它們並檢查腳本Han中是否有任何字符,它對應於中文(以及漢字和漢字)。

+0

謝謝!是否爲Ubuntu或其他發行版打包了任何第三方模塊?我沒有看到unicodedata2或unicodescript的軟件包。 python上是否有這個中斷的錯誤? – nealmcb

2

我嘗試了nneonneo在他的回答中提到的Python的unicodedata模塊,我認爲它可能有效。

>>> import unicodedata 
>>> unicodedata.name('你') 
'CJK UNIFIED IDEOGRAPH-4F60' 
>>> unicodedata.name('桜') 
'CJK UNIFIED IDEOGRAPH-685C' 
>>> unicodedata.name('あ') 
'HIRAGANA LETTER A' 
>>> unicodedata.name('ア') 
'KATAKANA LETTER A' 
>>> unicodedata.name('a') 
'LATIN SMALL LETTER A' 

正如你看到的,中國文字和日本採用中國文字被歸類到CJK UNIFIED IDEOGRAPH和平假名和片假名正確識別。我沒有測試韓文字符,但我認爲它們也應該屬於CJK UNIFIED IDEOGRAPH

另外,如果你只關心它是否是一個CJK字符/字母或沒有,看來這是簡單的:

>>> import unicodedata 
>>> unicodedata.category('你') 
'Lo' 
>>> unicodedata.category('桜') 
'Lo' 
>>> unicodedata.category('あ') 
'Lo' 
>>> unicodedata.category('ア') 
'Lo' 
>>> unicodedata.category('a') 
'Ll' 
>>> unicodedata.category('A') 
'Lu' 

hereLl是小寫,Lu是大寫和Lo是其他。

+0

韓國的韓文字符一般是這樣標識的。 「統一」部分收集(通常)在這些腳本之間共享的字形,但韓文腳本完全是韓語。無論如何,要查看腳本屬性而不是塊名或類別(有許多'Lo'字符是數學符號,圖形裝飾等,或者只是不在您正在查找的腳本之一中。阿拉伯語,希伯來語,印度語腳本等都沒有大小寫區分。) – tripleee

+0

@tripleee有沒有一種簡單的方法來完成你在Python中的建議? – Jellyflower

+0

查看@ nneonneo的回答。 – tripleee

相關問題