2010-09-30 11 views
12

मैं सरल पायथन फ़ंक्शन ढूंढ रहा हूं जो एक स्ट्रिंग लेता है और एक समान लौटाता है लेकिन सभी गैर-असीसी वर्णों को उनके निकटतम एसीआईआई समकक्ष में परिवर्तित किया जाता है। उदाहरण के लिए, उच्चारविज्ञान और क्या नहीं छोड़ा जाना चाहिए। मैं कल्पना कर रहा हूं कि ऐसा करने के लिए एक सुंदर कैनोनिकल तरीका होना चाहिए और वहां से संबंधित स्टैक ओवरफ्लो प्रश्न हैं लेकिन मुझे एक साधारण उत्तर नहीं मिल रहा है, इसलिए यह एक अलग सवाल के लायक लग रहा था।पाइथन रेगेक्स को स्ट्रिंग में गैर-एसीआई अक्षरों को निकटतम एसीआई समकक्षों में परिवर्तित करने के लिए

उदाहरण इनपुट/आउटपुट:

"Étienne" -> "Etienne" 
+6

आप "निकटतम" को कैसे परिभाषित करते हैं? – nmichaels

+0

अच्छा सवाल! मुझे लगता है कि मुझे उम्मीद है कि इसे परिभाषित नहीं करना है, कि कहीं कुछ मानक, स्वीकार्य मैपिंग है। मुझे यकीन है कि यह वास्तव में सही करने की कल्पना करने की तुलना में बालों वाली है, लेकिन आंशिक समाधान भी मूल्यवान होंगे। – dreeves

+2

'iconv' इसे '// ट्रान्सलिट' ध्वज के साथ कर सकता है, यह सुनिश्चित नहीं है कि इसके लिए कोई उचित पायथन बाइंडिंग है या नहीं। – Wrikken

उत्तर

1

'iconv translit अजगर' के लिए एक खोज कर मैंने पाया: http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/ जो यह की तरह लग रहा हो सकता है कि तुम क्या जरूरत है। टिप्पणियों में कुछ अन्य विचार हैं जो इसके बजाय मानक पुस्तकालय का उपयोग करते हैं।

http://web.archive.org/web/20070807224749/http://techxplorer.com/2006/07/18/converting-unicode-to-ascii-using-python/ भी है जो जहां संभव हो वहां मूल पात्र प्राप्त करने के लिए एनएफकेडी का उपयोग करता है।

2

अजगर 3 में और PyPI पर regex कार्यान्वयन का उपयोग:

तार के साथ शुरू:

>>> import unicodedata 
>>> import regex 
>>> regex.sub(r"\p{Mn}", "", unicodedata.normalize("NFKD", s)) 
'Etienne' 
+1

वह वास्तव में बहुत कुछ नहीं करता है। उदाहरण के लिए, कोड पॉइंट यू +00 एफ 8, * ø *, ** ** ** चिह्नों के साथ कुछ करने के लिए ** विघटित नहीं करता है। लेकिन यह अभी भी वही प्राथमिक संयोजन शक्ति है * ओ * है: 138 ई प्रति डीयूसीईटी 6.0। इसी प्रकार, कोड पॉइंट यू +00 एफ 0, * ð। * के लिए कोई अपघटन नहीं है, हालांकि, इसकी प्राथमिक collation शक्ति 1250 पर * डी * के समान ही है। लोगों को * यूनिकोड के साथ * काम करने के लिए सीखना होगा, इसके खिलाफ नहीं! – tchrist

+0

मैंने आपके द्वारा निर्दिष्ट लाइब्रेरी को देखा है, और यह बहुत रोमांचक लग रहा है। क्या आप इसके लेखक हैं?मुझे कुछ समय के लिए बेहतर यूनिकोड समर्थन के साथ एक पायथन लाइब्रेरी में दिलचस्पी है। मुझे इसे देखने दें और आपको मेल भेजें। बहुत बहुत धन्यवाद। – tchrist

+0

आपका कोड मेरे लिए "Étienne" प्रिंट करता है ... – Cerin

1

:

>>> s = "Étienne" 

मानक के अनुसार NFKD के लिए और फिर डायाक्रिटिक्स को दूर कुछ डुप्लिकेट सवालों के जवाब पढ़ें। एनएफकेडी जिमिक केवल एक उच्चारण स्ट्रिपर के रूप में काम करता है। यह ligatures और अन्य लैटिन आधारित पात्रों को संभाल नहीं करता है जो विघटित (या नहीं) हो सकता है। इसके लिए एक तैयार अनुवाद तालिका आवश्यक है (और बहुत तेज)।

+0

धन्यवाद जॉन। मैं वास्तव में यूनिकोड डेटा को विचलित करने वाले लोगों को देखने से नफरत करता हूं। आमतौर पर ऐसा इसलिए होता है क्योंकि वे नहीं जानते कि केवल कोलेशन शक्ति 1 (प्राथमिक) पर तुलना कैसे करें। उदाहरण के लिए, स्तर 1 पर 99 ए, 43 बी, 53 सी, इत्यादि हैं। ओ में सबसे ज्यादा 111 है, क्यू 34 में सबसे कम है। एनएफकेडी उन संख्याओं को थोड़ा ऊपर उठाता है, उदाहरण के लिए ए के 115 और ओ के 119 को चित्रित करता है। – tchrist

4

इस प्रश्न को पढ़ने से मुझे कुछ बेहतर दिखने लगा।

https://pypi.python.org/pypi/Unidecode/0.04.1

वास्तव में आप के लिए क्या पूछना है।

+0

बस 'पाइप यूनिडोड स्थापित करें' और यह चीनी के साथ भी काम करता है! धन्यवाद! – Adam

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

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