Python và biểu thức chính quy với Unicode


83

Tôi cần xóa một số ký hiệu Unicode khỏi chuỗi 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'

Tôi biết chắc chắn chúng tồn tại ở đây. Tôi đã thử:

re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ')

nhưng nó không hoạt động. Chuỗi vẫn giữ nguyên. Tôi đang làm gì sai?

Câu trả lời:


110

Bạn đang sử dụng python 2.x hay 3.0?

Nếu bạn đang sử dụng 2.x, hãy thử đặt chuỗi regex thành chuỗi unicode-Escape, với 'u'. Vì đó là regex, nên thực hành tốt để biến chuỗi regex của bạn thành một chuỗi thô, với 'r'. Ngoài ra, đặt toàn bộ mẫu của bạn trong ngoặc đơn là không cần thiết.

re.sub(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', '', ...)

http://docs.python.org/tutorial/introduction.html#unicode-strings

Biên tập:

Bạn cũng nên sử dụng cờ re.UNICODE / re.U / (? U) cho các biểu tượng unicode, nhưng nó chỉ ảnh hưởng đến các bí danh lớp ký tự như \ w hoặc \ b, trong đó mẫu này không sử dụng bất kỳ và như vậy sẽ không bị ảnh hưởng bởi.


15
Hmm, không biết bạn có thể nối cả hai tiền tố urtiền tố. Điều đó khá tuyệt!
Balthazar Rouberol

6
@BalthazarRouberol tôi nhận được SyntaxError: invalid syntax bằng Python 3.6
Umair Ayub

75

Sử dụng chuỗi unicode . Sử dụng cờ re.UNICODE .

>>> myre = re.compile(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', 
                      re.UNICODE)
>>> myre
<_sre.SRE_Pattern object at 0xb20b378>
>>> mystr = u'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'
>>> result = myre.sub('', mystr)
>>> len(mystr), len(result)
(38, 22)
>>> print result
بسم الله الرحمن الرحيم

Đọc bài viết của Joel Spolsky được gọi là Mức tối thiểu Tuyệt đối Mọi Nhà phát triển Phần mềm Tuyệt đối, Tích cực Phải Biết về Unicode và Bộ ký tự (Không có lý do!)


11
bài viết thật tuyệt vời
Fluffy

@nosklo, tại sao dấu ngoặc nhọn đặt số ký tự - {5} - không hoạt động với các ký tự unicode, tôi đang gặp sự cố với nó, tuy nhiên, dấu + hoạt động tốt.. bạn có ý kiến ​​gì không? Cảm ơn!
securecurve

@securecurve Tôi không biết, và không có quả cầu pha lê ma thuật của tôi thì không có cách nào giúp được. Tôi vừa thử nghiệm nó, và nó hoạt động tốt đối với tôi. Nếu nó không hiệu quả với bạn, tôi khuyên bạn nên đặt một câu hỏi mới, cung cấp mã của bạn và kết quả bạn nhận được.
nosklo

4
Trong trường hợp bạn muốn sử dụng retrong python, bạn phải biết rằng nó không hỗ trợ thuộc tính ký tự Unicode (như \p{L}). pypi.python.org/pypi/regex thì có.
ồn ào

re.UNICODEcờ là vô ích ở đây, vì nó chỉ ảnh hưởng đến các lớp nhân vật viết tắt \w, \d, \s.
nhahtdh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.