2013-06-13 7 views
7

पायथन में यूनिकोड स्ट्रिंग से वर्ण संशोधक को स्ट्रिप करने का सबसे आसान तरीका क्या है?स्ट्रिप यूनिकोड चरित्र संशोधक

उदाहरण के लिए:

आर्थर आर्थर

हो जाना चाहिए मैं डॉक्स की कोशिश की, लेकिन मैं कुछ भी है कि यह करता है नहीं पा सके।

उत्तर

6

इस

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")) 

यह निशान है, जो है कि मैं क्या लगता है कि आप चाहते हैं के रूप में वर्गीकृत सभी पात्रों को हटा देगा का प्रयास करें। आम तौर पर, आप unicodedata.category के साथ एक चरित्र की श्रेणी प्राप्त कर सकते हैं।

+3

+1। लेकिन यहां '' एम 'के बजाय '.startswith (' M ')' का उपयोग करना बेहतर है। 6.1 के अनुसार, किसी भी श्रेणी के 'एम' उपश्रेणियां नहीं हैं, लेकिन भविष्य में कोई भी नियम नहीं कह सकता है कि भविष्य में नहीं हो सकता है। – abarnert

+0

@abarnert: तो आप कह रहे हैं कि भविष्य में तोड़ने वाले किसी चीज़ का उपयोग करना बेहतर होगा? – martineau

+0

@ मार्टिनौ: नहीं, भविष्य में कुछ ऐसा नहीं करना चाहिए जो _will not_ तोड़ने के लिए बेहतर है। यदि 'एम' श्रेणी के उपश्रेणियों को जोड़ा गया है, तो यह अंक के संयोजन के लिए होगा। यदि किसी अन्य श्रेणी की एक नई 'एम' उपश्रेणी जोड़ दी गई है, तो यह अंक के संयोजन के लिए नहीं होगी। तो, अंकों के संयोजन के लिए सही नियम 'cat.startswith ('एम')' है, बिल्ली में 'एम' नहीं है। (यह _that_ आने की संभावना नहीं है, क्योंकि उन्होंने कोई भी नया उपश्रेणियां नहीं जोड़े हैं जो मुख्य श्रेणियों द्वारा उपयोग किए जाने वाले अक्षरों को साझा करते हैं, और केवल मौजूदा एक 'एलसी' खाली कर देते हैं। लेकिन सही काम करने में कोई नुकसान नहीं होता है, और कम से कम संभावित लाभ।) – abarnert

5

तुम भी r'\p{M}' इस्तेमाल कर सकते हैं कि समर्थित है regex module द्वारा:

import regex 

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

उदाहरण:

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

अपने यूज-केस के आधार पर एक श्वेत सूची दृष्टिकोण बेहतर उदाहरण हो सकता है, केवल इनपुट सीमित करने के लिए एएससीआई अक्षरों के लिए:

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

परिणाम पाठ में उपयोग किए गए यूनिकोड सामान्यीकरण पर निर्भर हो सकता है।

+0

सामान्यीकरण पर अच्छा बिंदु-एक या अधिक अंकों को अक्षरों में से एक में बनाया जा सकता है, इस मामले में आप उस पत्र को खो देंगे। लेकिन आप 'unicoredata.normalize (' एनएफडी ', एस) .encode (' ascii ',' अनदेखा ') कर कर हल कर सकते हैं। Decode (' ascii ') '। (आप इसके बजाय 'एनएफकेडी' का उपयोग करना चाहते हैं, इस पर निर्भर करता है कि आप यू + 2160 ('Ⅰ') जैसी चीज़ों की अपेक्षा करते हैं या नहीं, और यदि ऐसा है, तो आप उन्हें संगत समकक्ष यू +0049 (' I') या उन्हें छोड़ दें।) – abarnert

संबंधित मुद्दे