2013-06-13 20 views

cevap

6

bu

import unicodedata 
a = u"STRING GOES HERE" # using an actual string would break stackoverflow's code formatting. 
u"".join(x for x in a if not unicodedata.category(x).startswith("M")) 

Bu Ne istediğini düşünüyorum budur işaretleri olarak sınıflandırılan tüm karakterleri kaldırır deneyin. Genel olarak, unicodedata.category ile bir karakter kategorisini alabilirsiniz. Bir beyaz liste yaklaşım daha iyi örneğin olabilir lütfen kullanım durumunda bağlı

>>> print s 
A͋͠r͍̞̫̜t̼̭͞h́u̡̙̞̘rͬͣ̐ͮ 
>>> def remove_marks(text): 
...  return regex.sub(ur"\p{M}+", "", text) 
...  
... 
>>> print remove_marks(s) 
Arthur 

sadece girişini sınırlamak için:

import regex 

def remove_marks(text): 
    return regex.sub(ur"\p{M}+", "", text) 

Örnek:

+3

+ 1. Ama '' in '' yerine ''.startswith (' M ')' yi kullanmak daha iyidir. 6.1'den itibaren, herhangi bir kategorinin “M” alt kategorisi yoktur, ancak gelecekte olmayacağını söyleyen bir kural yoktur. – abarnert

+0

@abarnert: Öyleyse gelecekte kırılabilecek bir şey kullanmanın daha iyi olduğunu mu söylüyorsun? – martineau

+0

3Martineau: Hayır, gelecekte kırmayacak bir şey kullanmak daha iyi. 'M' kategorisinin alt kategorileri eklendiyse, işaretlerin birleştirilmesi için olacaktır. Başka bir kategorinin yeni bir "M" alt kategorisi eklendiyse, bu işaretlerin birleştirilmesi söz konusu olmayacaktır. Yani, işaretleri birleştirmek için doğru kural 'cat.startswith ('M')', '' kedi '' değil. (Onların ana kategoride kullandığı harfleri paylaşılan ve 'LC' sadece mevcut boşaltılmış herhangi bir yeni alt kategori ekledik değil çünkü, gelip _that_ olası değil. Ama orada doğru olanı yapıyor bir zarar ve En az potansiyel fayda.) – abarnert

5

Ayrıca regex module tarafından desteklendiğini r'\p{M}' kullanabilirsiniz ascii karakterleri:

>>> s.encode('ascii', 'ignore').decode('ascii') 
u'Arthur' 

Sonuç, metinde kullanılan Unicode normalizasyonuna bağlı olabilir.

+0

İyi nokta o mektubu kaybedecektin bu durumda harfler, birine meydana olabilir. Ama 'unicoredata.normalize ('MÇB'yi', s) .encode ('ascii', 'görmezden') yaparak bu çözebilir. ('ASCII')' deşifre. (Sen gibi şeyler almak için beklemek bağlı olarak, onun yerine 'NFKD' kullanmak isteyebilirsiniz U + 2160 ('Ⅰ') ve, uyumlu eşdeğer U + 0049 (' I' olarak ele isteyip, eğer öyleyse) veya atlayın.) – abarnert