簡體   English   中英

python 2.x中unicode字符串的string.ascii_letters相當於?

[英]An equivalent to string.ascii_letters for unicode strings in python 2.x?

在標准庫的“字符串”模塊中,

string.ascii_letters ## Same as string.ascii_lowercase + string.ascii_uppercase

'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

是否有一個類似的常量,包括所有被認為是unicode中的字母的東西?

您可以使用以下內容構造自己的Unicode大寫和小寫字母常量:

import unicodedata as ud
all_unicode = ''.join(unichr(i) for i in xrange(65536))
unicode_letters = ''.join(c for c in all_unicode
                          if ud.category(c)=='Lu' or ud.category(c)=='Ll')

這使得字符串長度為2153個字符(縮小的Unicode Python構建)。 對於letter in unicode_letters代碼,使用set代碼會更快:

unicode_letters = set(unicode_letters)

沒有字符串,但您可以使用unicodedata模塊檢查字符是否是字母,特別是其category()函數。

>>> unicodedata.category(u'a')
'Ll'
>>> unicodedata.category(u'A')
'Lu'
>>> unicodedata.category(u'5')
'Nd'
>>> unicodedata.category(u'ф') # Cyrillic f.
'Ll'
>>> unicodedata.category(u'٢') # Arabic-indic numeral for 2.
'Nd'

Ll表示“字母,小寫”。 Lu意思是“字母,大寫”。 Nd表示“數字,數字”。

這將是一個相當大的常數。 Unicode目前涵蓋超過100,000個不同的字符。 所以答案是否定的。

問題是你為什么需要它? 例如,可能有一些其他方法可以解決unicodedata模塊的問題。

更新:您可以從ftp://ftp.unicode.org/下載包含所有unicode數據點名稱和其他信息的文件,並使用它做大量有趣的事情。

正如在以前的答案中提到,該字符串確實是太長了。 因此,您必須針對(a)特定語言。
[編輯:我意識到這是我原來的預期用途,對於大多數用途,我猜。 然而,與此同時,Mark Tolonen對這個問題給出了一個很好的答案,所以我選擇了他的答案,盡管我使用了以下解決方案]

使用“locale”模塊可以輕松完成此操作:

import locale
import string
code = 'fr_FR' ## Do NOT specify encoding (see below)
locale.setlocale(locale.LC_CTYPE, code)
encoding = locale.getlocale()[1]
letters = string.letters.decode(encoding)

“letters”是一個117個字符長的unicode字符串。

顯然,string.letters依賴於所選語言代碼的默認編碼,而不是語言本身。 將語言環境設置為fr_FR或de_DE或es_ES會將string.letters更新為相同的值(因為它們都默認在ISO8859-1中編碼)。

如果向語言代碼(de_DE.UTF-8)添加編碼,則將使用默認編碼而不是string.letters。 如果您使用上述其余代碼,那將導致UnicodeDecodeError。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM