2009-05-30 7 views
5

मैं एक डेटाबेस जैसे नामों से भरा है:अजगर स्ट्रिंग सफाई + हेरफेर (उच्चारण वर्ण)

John Smith 
Scott J. Holmes 
Dr. Kaplan 
Ray's Dog 
Levi's 
Adrian O'Brien 
Perry Sean Smyre 
Carie Burchfield-Thompson 
Björn Árnason 

वहाँ उन में उच्चारण के साथ कुछ विदेशी नामों गैर स्वराघात वर्ण के साथ तार करने के लिए परिवर्तित किया जा करने की आवश्यकता है ।

मैं पूरा नाम (" '", जैसे पात्रों अलग करना के बाद "-") रूपांतरित करना चाहते हैं की तरह उपयोगकर्ता के लॉगिन करने के लिए:

john.smith 
scott.j.holmes 
dr.kaplan 
rays.dog 
levis 
adrian.obrien 
perry.sean.smyre 
carie.burchfieldthompson 
bjorn.arnason 

अब तक मेरे पास है:

Fullname.strip() # get rid of leading/trailing white space 
Fullname.lower() # make everything lower case 


... # after bad chars converted/removed 
Fullname.replace(' ', '.') # replace spaces with periods 
+1

यह ** सभी बुराई और गलत ** है, और संक्षेप में आक्रामक है, ऐसे सभी पात्रों को विचलित करने के लिए। यदि आप ऐसा करते हैं तो आप अंग्रेजी को ठीक से भी लिख नहीं सकते हैं। एएससीआईआई मर चुका है !!! – tchrist

उत्तर

12

पेज

def latin1_to_ascii (unicrap): 
    """This replaces UNICODE Latin-1 characters with 
    something equivalent in 7-bit ASCII. All characters in the standard 
    7-bit ASCII range are preserved. In the 8th bit range all the Latin-1 
    accented letters are stripped of their accents. Most symbol characters 
    are converted to something meaningful. Anything not converted is deleted. 
    """ 
    xlate = { 
     0xc0:'A', 0xc1:'A', 0xc2:'A', 0xc3:'A', 0xc4:'A', 0xc5:'A', 
     0xc6:'Ae', 0xc7:'C', 
     0xc8:'E', 0xc9:'E', 0xca:'E', 0xcb:'E', 
     0xcc:'I', 0xcd:'I', 0xce:'I', 0xcf:'I', 
     0xd0:'Th', 0xd1:'N', 
     0xd2:'O', 0xd3:'O', 0xd4:'O', 0xd5:'O', 0xd6:'O', 0xd8:'O', 
     0xd9:'U', 0xda:'U', 0xdb:'U', 0xdc:'U', 
     0xdd:'Y', 0xde:'th', 0xdf:'ss', 
     0xe0:'a', 0xe1:'a', 0xe2:'a', 0xe3:'a', 0xe4:'a', 0xe5:'a', 
     0xe6:'ae', 0xe7:'c', 
     0xe8:'e', 0xe9:'e', 0xea:'e', 0xeb:'e', 
     0xec:'i', 0xed:'i', 0xee:'i', 0xef:'i', 
     0xf0:'th', 0xf1:'n', 
     0xf2:'o', 0xf3:'o', 0xf4:'o', 0xf5:'o', 0xf6:'o', 0xf8:'o', 
     0xf9:'u', 0xfa:'u', 0xfb:'u', 0xfc:'u', 
     0xfd:'y', 0xfe:'th', 0xff:'y', 
     0xa1:'!', 0xa2:'{cent}', 0xa3:'{pound}', 0xa4:'{currency}', 
     0xa5:'{yen}', 0xa6:'|', 0xa7:'{section}', 0xa8:'{umlaut}', 
     0xa9:'{C}', 0xaa:'{^a}', 0xab:'<<', 0xac:'{not}', 
     0xad:'-', 0xae:'{R}', 0xaf:'_', 0xb0:'{degrees}', 
     0xb1:'{+/-}', 0xb2:'{^2}', 0xb3:'{^3}', 0xb4:"'", 
     0xb5:'{micro}', 0xb6:'{paragraph}', 0xb7:'*', 0xb8:'{cedilla}', 
     0xb9:'{^1}', 0xba:'{^o}', 0xbb:'>>', 
     0xbc:'{1/4}', 0xbd:'{1/2}', 0xbe:'{3/4}', 0xbf:'?', 
     0xd7:'*', 0xf7:'/' 
    } 

    r = '' 
    for i in unicrap: 
     if xlate.has_key(ord(i)): 
      r += xlate[ord(i)] 
     elif ord(i) >= 0x80: 
      pass 
     else: 
      r += i 
    return r 

# This gives an example of how to use latin1_to_ascii(). 
# This creates a string will all the characters in the latin-1 character set 
# then it converts the string to plain 7-bit ASCII. 
if __name__ == '__main__': 
s = unicode('','latin-1') 
for c in range(32,256): 
    if c != 0x7f: 
     s = s + unicode(chr(c),'latin-1') 
print 'INPUT:' 
print s.encode('latin-1') 
print 
print 'OUTPUT:' 
print latin1_to_ascii(s) 
से कोड के लिए इस लिंक [संशोधित]

यहाँ पर एक नजर डालें है

+0

आपका लिंक मुझे "ब्रिटनी स्पीयर्स नग्न" – mpen

+2

@ मार्क-हा, वेबलेक्स की स्थायीता के लिए हुरे में ले जाता है! –

1

मैं इस

# coding=utf-8 

def alnum_dot(name, replace={}): 
    import re 

    for k, v in replace.items(): 
     name = name.replace(k, v) 

    return re.sub("[^a-z.]", "", name.strip().lower()) 

print alnum_dot(u"Frédrik Holmström", { 
    u"ö":"o", 
    " ":"." 
}) 

दूसरा तर्क की तरह कुछ करना होगा पात्रों आप प्रतिस्थापित करना चाहते हैं की एक dict, सभी गैर a-z और है। जिन वर्णों को प्रतिस्थापित नहीं किया गया है उन्हें

1

अनुवाद विधि आपको वर्णों को हटाने की अनुमति देती है। आप मनमाने ढंग से वर्णों को हटाने के लिए इसका उपयोग कर सकते हैं।

Fullname.translate(None,"'-\"") 

यदि आप पात्रों के पूरे वर्गों को हटाना चाहते हैं, तो आप पुनः मॉड्यूल का उपयोग करना चाहेंगे।

re.sub('[^a-z0-9 ]', '', Fullname.strip().lower(),) 
3

निम्नलिखित समारोह सामान्य है:

import unicodedata 

def not_combining(char): 
     return unicodedata.category(char) != 'Mn' 

def strip_accents(text, encoding): 
     unicode_text= unicodedata.normalize('NFD', text.decode(encoding)) 
     return filter(not_combining, unicode_text).encode(encoding) 

# in a cp1252 environment 
>>> print strip_accents("déjà", "cp1252") 
deja 
# in a cp1253 environment 
>>> print strip_accents("καλημέρα", "cp1253") 
καλημερα 

जाहिर है, आप अपने तार की एन्कोडिंग पता होना चाहिए।

5

यदि आप तृतीय-पक्ष मॉड्यूल स्थापित करने से डरते नहीं हैं, तो python port of the Perl module Text::Unidecode पर देखें (यह भी on pypi है)।

मॉड्यूल वर्णों को लिप्यंतरित करने के लिए लुकअप तालिका का उपयोग करने के अलावा कुछ भी नहीं करता है। मैंने कोड पर देखा और यह बहुत आसान लग रहा है। तो मुझे लगता है कि यह किसी भी ओएस और किसी भी पायथन संस्करण (क्रॉसिंगफिंगर्स) पर बहुत अधिक काम कर रहा है। अपने आवेदन के साथ बंडल करना भी आसान है।

इस मॉड्यूल के साथ आपको मैन्युअल रूप से अपनी लुकअप टेबल बनाने की आवश्यकता नहीं है (= यह जोखिम कम हो गया है)।

यूनिकोड सामान्यीकरण तकनीक की तुलना में इस मॉड्यूल का लाभ यह है: यूनिकोड सामान्यीकरण सभी वर्णों को प्रतिस्थापित नहीं करता है। एक अच्छा उदाहरण "æ" जैसा चरित्र है। यूनिकोड सामान्यीकरण इसे "पत्र, लोअरकेस" (एलएल) के रूप में देखेगा। इसका मतलब है कि normalize विधि का उपयोग करने से आपको न तो एक प्रतिस्थापन चरित्र और न ही एक उपयोगी संकेत मिलेगा। दुर्भाग्यवश, वह चरित्र ASCII में प्रतिनिधित्व योग्य नहीं है। तो आपको त्रुटियां मिलेंगी।

उल्लेख किया गया module इस पर एक बेहतर काम करता है। यह वास्तव में "एई" के साथ "æ" को प्रतिस्थापित करेगा। जो वास्तव में उपयोगी है और समझ में आता है।

मैंने देखा है कि सबसे प्रभावशाली बात यह है कि यह बहुत आगे जाता है।यह जापानी काना वर्णों को भी अधिकतर को ठीक से बदल देता है। उदाहरण के लिए, यह "は" को "हे" के साथ बदल देता है। Wich पूरी तरह से ठीक है। यह मूर्ख-प्रमाण नहीं है हालांकि वर्तमान संस्करण "ち" को "ची" के बजाय "टीआई" के साथ बदलता है। तो आपको इसे अधिक विदेशी पात्रों की देखभाल के साथ संभालना होगा। मॉड्यूल के

प्रयोग सीधा है ::

from unidecode import unidecode 
var_utf8 = "æは".decode("utf8") 
unidecode(var_utf8).encode("ascii") 
>>> "aeha" 

ध्यान दें कि मैं इस मॉड्यूल सीधे कोई लेना देना नहीं है। ऐसा होता है कि मुझे यह बहुत उपयोगी लगता है।

संपादित करें: मैंने जो पैच प्रस्तुत किया है वह जापानी काना से संबंधित बग को ठीक करता है। मैंने केवल उस व्यक्ति को ठीक कर दिया है जिसे मैं तुरंत देख सकता हूं। मैंने कुछ याद किया होगा।

+0

मैंने कल कन्न प्रतिस्थापन के साथ मुद्दों को ठीक करने के लिए एक पैच प्रस्तुत किया। यह पहले ही विलय हो चुका है! – exhuma

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