Bạn cũng có thể sử dụng r'\p{M}'
được hỗ trợ bởi regex module:
import regex
def remove_marks(text):
return regex.sub(ur"\p{M}+", "", text)
Ví dụ:
>>> print s
A͋͠r͍̞̫̜t̼̭͞h́u̡̙̞̘rͬͣ̐ͮ
>>> def remove_marks(text):
... return regex.sub(ur"\p{M}+", "", text)
...
...
>>> print remove_marks(s)
Arthur
Tùy thuộc vào tình huống sử dụng của bạn một cách tiếp cận danh sách trắng có thể là ví dụ tốt hơn, để hạn chế đầu vào chỉ thành các ký tự ascii:
>>> s.encode('ascii', 'ignore').decode('ascii')
u'Arthur'
Kết quả có thể phụ thuộc vào chuẩn hóa Unicode được sử dụng trong văn bản.
+1. Nhưng tốt hơn nên sử dụng '.startswith ('M')' thay vì ''M' trong' ở đây. Kể từ 6.1, không có danh mục phụ 'M' thuộc bất kỳ danh mục nào, nhưng không có quy tắc nào nói rằng không thể có trong tương lai. – abarnert
@abarnert: Vì vậy, bạn đang nói nó tốt hơn để sử dụng một cái gì đó có thể phá vỡ trong tương lai? – martineau
@martineau: Không, tốt hơn là nên sử dụng thứ gì đó mà _will not_ đột nhập trong tương lai. Nếu một danh mục con của danh mục 'M' được thêm vào, thì nó sẽ là để kết hợp các nhãn hiệu. Nếu một danh mục con 'M' mới của một số danh mục khác được thêm vào, nó sẽ không được dùng để kết hợp các nhãn hiệu. Vì vậy, quy tắc phù hợp để kết hợp các dấu là 'cat.startswith ('M')', không phải ''M' trong cat'. (Nó không phải là _that_ có khả năng xuất hiện, bởi vì họ chưa thêm bất kỳ tiểu thể loại mới nào dùng chung các chữ cái được sử dụng bởi các danh mục chính, và dọn sạch các chữ cái hiện có, 'LC'. Nhưng không có hại gì khi làm điều đúng, và tại ít nhất lợi ích tiềm năng.) – abarnert