2012-01-01 22 views
9

संभव डुप्लिकेट:
What is the best way to remove accents in a python unicode string?
Python and character normalizationको हटाने के लहजे और विशेष वर्ण

मैं, लहजे को दूर लोअरकेस सभी पात्रों की बारी है, और किसी भी संख्या और विशेष वर्ण को नष्ट करना चाहते हैं।

उदाहरण:

Frédér8ic @ -> Frederic

प्रस्ताव:

def remove_accents(data): 
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if \ 
    unicodedata.category(x)[0] == 'L').lower() 

वहाँ यह करने के लिए किसी भी बेहतर तरीका है?

+0

क्या आप वांछित इनपुट और आउटपुट के कुछ उदाहरणों को शामिल करने के लिए अपना उत्तर संपादित कर सकते हैं? –

+0

@ क्रिस्टियन जोनासेन Frédér8ic @ -> frederic @@ àbcd -> abcd% * tréçd -> trecd – Fred

+0

मैं पायथन 3.x – Fred

उत्तर

14

सम्भावित समाधान

def remove_accents(data): 
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if x in string.ascii_letters).lower() 

हो का उपयोग NFKD AFAIK यूनिकोड को सामान्य बनाने में यह संगत पात्रों में बदलने के लिए मानक तरीका है जाएगा। शेष सामान्य वर्ण संख्याओं और यूनिकोड वर्णों को सामान्यीकरण से उत्पन्न करने के लिए, आप बस string.ascii_letters से तुलना कर सकते हैं और उस सेट में किसी भी वर्ण को नहीं हटा सकते हैं।

+0

बहुत अच्छा, धन्यवाद! – Fred

+2

लेकिन उस कमांड में स्ट्रिंग वैरिएबल क्या है? जहां आप 'if x में string.ascii_letters' – Falcoa

+0

@ फाल्को को कठोर मानते हैं। एक और समाधान def remove_accents (स्वयं, डेटा): वापस unicodedata.normalize ('एनएफकेडी', डेटा) .encode ('ASCII', 'अनदेखा') – lesimoes

1

क्या आप स्ट्रिंग को HTML इकाइयों में परिवर्तित कर सकते हैं? यदि ऐसा है, तो आप एक साधारण नियमित अभिव्यक्ति का उपयोग कर सकते हैं।

निम्नलिखित प्रतिस्थापन PHP/PCRE (उदाहरण के लिए my other answer देखें) में काम करेगा:

'~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i' => '$1' 

तो बस HTML संस्थाओं से वापस बदलने और किसी भी गैर a-Z चार (demo @ CodePad) को हटा दें।

क्षमा करें मुझे पाइथन को एक पायथनिक उत्तर प्रदान करने के लिए पर्याप्त जानकारी नहीं है।

+1

से अधिक कुशल खोजता हूं, मुझे यकीन नहीं है कि रेगेक्स यूनिकोडडाटा – Fred

+0

@ user1125315 से अधिक कुशल हैं: मुझे यकीन नहीं है, लेकिन यह आपके इनपुट/आउटपुट परीक्षणों को सही ढंग से पास करता है। हालांकि अन्य दृष्टिकोणों को आजमाने के लिए स्वतंत्र महसूस करें, 'unidecode' lib भयानक लगता है। –

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