2013-01-09 35 views
6

Thường thì người ta muốn liệt kê tất cả các ký tự trong một danh mục Unicode đã cho. Ví dụ:Liệt kê tất cả các ký tự trong một danh mục Unicode nhất định

Có thể tạo ra danh sách này bằng cách duyệt qua tất cả các mã Unicode-điểm và thử nghiệm cho danh mục bạn muốn (Python 3):

[c for c in map(chr, range(0x110000)) if unicodedata.category(c) in ('Ll',)] 

hoặc sử dụng regexes,

re.findall(r'\s', ''.join(map(chr, range(0x110000)))) 

Nhưng các phương pháp này chậm. Có cách nào để tìm kiếm danh sách các nhân vật trong danh mục mà không phải lặp lại tất cả các ký tự đó không?

câu hỏi liên quan cho Perl: How do I get a list of all Unicode characters that have a given property?

Trả lời

9

Nếu bạn cần phải làm điều này thường xuyên, nó đủ dễ dàng để xây dựng cho mình một thể tái sử dụng bản đồ:

import sys 
import unicodedata 
from collections import defaultdict 

unicode_category = defaultdict(list) 
for c in map(chr, range(sys.maxunicode + 1)): 
    unicode_category[unicodedata.category(c)].append(c) 

Và từ đó về sử dụng ra rằng bản đồ để dịch ngược lại một chuỗi các ký tự cho một danh mục nhất định:

alphabetic = unicode_category['Ll'] 

Nếu điều này quá tốn kém để bắt đầu-u p thời gian, xem xét bán phá giá cấu trúc đó vào một tập tin; tải bản đồ này từ một tệp JSON hoặc định dạng nhanh-to-parse-to-dict khác không nên quá đau đớn.

Khi bạn đã lập bản đồ, hãy tìm kiếm một danh mục được thực hiện trong thời gian không đổi.

+4

chr() nên được thay thế bằng unichr() trong bản đồ() –

+2

@ m.kocikowski: trừ khi bạn đang sử dụng Python 3, mà OP của câu hỏi rõ ràng là (nó sẽ thất bại trong Python 2 nếu không). –

Các vấn đề liên quan