2013-04-17 36 views
7

Tôi sử dụng bộ mã thông báo để tách các câu tiếng Pháp thành các từ và gặp sự cố với các từ có chứa ký tự tiếng Pháp â.Python cực kỳ khó hiểu hành vi unexode regex

Tôi cố gắng để cô lập các vấn đề và cuối cùng nó luộc xuống thực tế đơn giản này:

>>> re.match(r"’", u'â', re.U) 
>>> re.match(r"[’]", u'â', re.U) 
<_sre.SRE_Match object at 0x21d41d0> 

â được kết hợp bởi một mẫu chứa nếu nó đặt trong một khớp quần.

Tôi có vấn đề gì liên quan đến việc xử lý UTF-8 hay là lỗi?

phiên bản python của tôi là:

Python 2.7.3 (default, Jan 2 2013, 13:56:14) 
[GCC 4.7.2] on linux2 

EDIT:

Hum, embarassingly đủ, có vẻ như thay thế r tiền tố mô hình với một u sửa chữa vấn đề này.

Tôi tự hỏi tại sao các tài liệu chính thức sử dụng rộng rãi r sau đó :((

+0

'r' là chính xác và quan trọng. Bạn nên ** thêm ** 'u' (xem câu trả lời) thay vì thay thế' r'. –

+0

@ m.buettner: yup Tôi đã chỉnh sửa trước khi xem câu trả lời. Tôi tiếp tục và kiểm tra những gì 'r' và' u' làm, và thực sự cả hai đều quan trọng. Cảm ơn :) – m09

Trả lời

7

mô hình của bạn nên là một chuỗi unicode quá:

>>> re.match(ur"’", u'â', re.U) 
>>> re.match(ur"[’]", u'â', re.U) 

Nếu không rõ ràng sre mã hóa â để latin-1 và tìm byte kết quả ba byte là utf-8 .

"[’]" tương đương với "[\xe2\x80\x99]"u'â'.encode('latin-1')\xe2.

+0

cảm ơn cho gợi ý, tôi nhận thấy nó ngay trước khi bạn trả lời :) – m09

+0

're.U' không kỳ diệu bật unicode, nó chỉ thay đổi ý nghĩa của' \ w'. –