2010-10-01 39 views
18

Làm cách nào để chỉ định một dải các ký tự unicode từ ' ' (không gian) đến \u00D7FF?Làm cách nào để chỉ định một dải các ký tự unicode

Tôi có cụm từ thông dụng như r'[\u0020-\u00D7FF]' và nó sẽ không biên dịch nói rằng đó là phạm vi xấu. Tôi mới vào Unicode biểu thức thông thường vì vậy tôi đã không có vấn đề này trước.

Có cách nào để thực hiện biên dịch này hoặc cụm từ thông dụng mà tôi quên hoặc chưa học được chưa?

+0

Nó biên dịch tốt đây (2.6.5) – NullUserException

+0

Bạn nói đúng - mà biên dịch - Tôi đã giả định rằng đó là phần của biểu thức chính quy mà tôi đang làm việc đang gặp vấn đề. Tôi sẽ đăng phần gây ra vấn đề cho tôi. – spig

Trả lời

24

Cú pháp của dãy unicode của bạn sẽ không làm những gì bạn mong đợi.

  1. Các nguyên r'' chuỗi ngăn \u thoát khỏi bị phân tích cú pháp, và động cơ regex sẽ không làm điều này. Phạm vi chỉ trong bộ này là [0-\]:

    >>> re.compile(r'[\u0020-\u00d7ff]', re.DEBUG) 
    in 
        literal 117 
        literal 48 
        literal 48 
        literal 50 
        range (48, 117) 
        literal 48 
        literal 48 
        literal 100 
        literal 55 
        literal 102 
        literal 102 
    
  2. Làm cho nó một Unicode đen causes \u parsing while leaving other backslashes alone (mặc dù đó không phải là một mối quan tâm ở đây), nhưng zero hàng đầu đang rối tung nó lên. Cú pháp là \uxxxx hoặc \Uxxxxxxxx, do đó được phân tích cú pháp là "\u00d7, f, f".

    >>> re.compile(ur'[\u0020-\u00d7ff]', re.DEBUG) 
    in 
        range (32, 215) 
        literal 102 
        literal 102 
    
  3. Loại bỏ các zeroes hàng đầu hoặc chuyển sang \U0000d7ff sẽ sửa chữa nó:

    >>> re.compile(ur'[\u0020-\ud7ff]', re.DEBUG) 
    in 
        range (32, 55295) 
    
+1

Cảm ơn rất nhiều - Tôi không có ý tưởng về tất cả các công cụ unicode. Vì vậy, nó phải có 4 chữ số với chữ thường 'u' và 8 với chữ hoa 'U', phải không? – spig

+0

Điều đó đúng. –

+0

Lưu ý câu trả lời này được thực hiện trong ngữ cảnh của Python 2. Trong Python 3, không có sự khác biệt giữa ví dụ 'r '" 'và' ur "ví dụ" '. – Flimm

5

Nếu bạn đang sử dụng Python 2.x, bạn nên chắc chắn rằng bạn đang xác định một chuỗi unicode (với u '', hay "unicode" built-in):

>>> r = re.compile(u'[\u0020-\uD7FF]') 
>>> r.search(u'foo \uD7F0 bar') 
<_sre.SRE_Match object at 0xb7084950> 
r.search(u' ') 
<_sre.SRE_Match object at 0xb7084b48> 

Sử dụng liệu chuỗi (như bạn đang có, với r '') cung cấp cho bạn chuỗi (ascii) được tạo bởi "backstroke" + chữ "u" cộng với số 0 cộng ...

+0

Bạn có cần ký tự '0' khi \ u không đủ dài để dài 4? Giống như một không gian, bạn chỉ có \ u20 nhưng bạn phải viết \ u0020 ?, phải không? – spig

+0

Tôi thấy bạn đã được trả lời, nhưng vâng, đúng vậy :) – rbp

+1

Điều gì về ** đầy đủ Unicode **? Ví dụ, khối Gothic chạy từ U + 10330 GOTHIC LETTER AHSA qua U + 1034A GOTHIC LETTER NINE HUNDRED nhưng cũng bao gồm năm điểm mã tiếp theo, hiện chưa được đặt tên? Làm thế nào để bạn trong Python thể hiện những ngôn ngữ lập trình khác cho phép bạn sử dụng '\ p {Gothic}', '\ p {Script = Gothic}', '\ p {InGothic}', hoặc '\ p {Block = Gothic}' cho? Ví dụ: trong Perl, '/ \ pN/&&/\ p {InGothic} /' sản lượng U + 10341 VÀO NINETY LETTER và U + 1034A GOTHIC LETTER NINE HUNDRED. Tuy nhiên, điều đó không hoạt động trong Python; tại sao không? – tchrist

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