2011-03-24 16 views
6

से यूनिकोड "विराम चिह्न" को कैसे पट्टी करें, यहां समस्या है, मेरे पास एक पाइथन स्क्लाइट क्वेरी में इनपुट के रूप में एक यूनिकोड स्ट्रिंग है। क्वेरी विफल ('पसंद')। यह स्ट्रिंग को बदल देता है, 'फ्रांस' में 6 वर्ण नहीं होते हैं, इसमें सात है। और सातवां है। । । यूनिकोड यू + एफईएफएफ, एक शून्य-चौड़ाई नो-ब्रेक स्पेस।पायथन स्ट्रिंग

प्रश्न से पहले मैं पृथ्वी पर ऐसी चीजों की कक्षा कैसे फंसता हूं?

+1

मुझे आश्चर्य है कि यह स्ट्रिंग कहां से आई थी। –

+0

यह विराम चिह्न नहीं है। इसका अस्तित्व कुछ अपस्ट्रीम प्रक्रिया में सकल विफलता को इंगित करता है। –

+0

गंभीरता से, आप सातवीं चरित्र के रूप में बीओएम के साथ पृथ्वी पर कैसे पहुंचे? –

उत्तर

10

आप पायथन में यूनिकोड डेटा तालिका के भाग के रूप unicodedata श्रेणियों का उपयोग हो सकता है:

>>> unicodedata.category(u'a') 
'Ll' 
>>> unicodedata.category(u'.') 
'Po' 
>>> unicodedata.category(u',') 
'Po' 

punctation पात्रों के लिए श्रेणियों के साथ शुरू जैसा कि आप देख सकते हैं 'पी'। तो आपको चार को चार से बाहर फ़िल्टर करने की आवश्यकता है (सूची समझ का उपयोग करके)।

यह भी देखें:

आपके मामले में:

>>> unicodedata.category(u'\ufeff') 
'Cf' 

तो तुम कुछ वर्णों के लिए श्रेणियों के आधार पर श्वेत-सूची प्रदर्शन कर सकते हैं।

+0

इन सभी सुझावों के लिए धन्यवाद। वे सबसे उपयोगी रहे हैं! –

+0

ओह, हाँ, और अन्य टिप्पणियों में सवालों के जवाब में स्रोत तार वेबपृष्ठों से हैं (जहां आप जानते हैं, कुछ भी हो सकता है)। एक उत्कृष्ट उत्तर के लिए –

+0

+1। यह मुझे ऐसा करने का उचित तरीका मानता है। –

0

यह बाइट-ऑर्डर मार्क, बीओएम भी है। बस सफाई अपने तार पहले उन समाप्त करने के लिए, की तरह कुछ का उपयोग कर:


>>> f = u'France\ufeff' 
>>> f 
u'France\ufeff' 
>>> print f 
France 
>>> f.replace(u'\ufeff', '') 
u'France' 
>>> f.strip(u'\ufeff') 
u'France' 
+0

यह मनमाने ढंग से "बकवास पात्रों" को नहीं हटाएगा। –

+0

यह सच है। मैं केवल वर्णित एक मुद्दे को संबोधित कर रहा था। –

+1

स्ट्रिंग की शुरुआत में यह केवल एक बीओएम है। –

1

सामान्य रूप से, यदि आप अपने उपयोग के मामले में ऐसी चीज को परिभाषित कर सकते हैं तो स्वीकार्य पात्रों के श्वेतसूची का उपयोग करके इनपुट सत्यापन किया जाना चाहिए। फिर आप श्वेतसूची पर नहीं है (या पूरी तरह से इनपुट को अस्वीकार) पर कुछ भी फेंक देते हैं।

यदि आप अनुमत वर्णों के एक सेट को परिभाषित कर सकते हैं, तो आप बाकी सब कुछ बाहर निकालने के लिए नियमित अभिव्यक्ति का उपयोग कर सकते हैं।

उदाहरण के लिए, मान लीजिए कि आप जानते हैं कि "देश" केवल अपर-केस अंग्रेज़ी अक्षरों और रिक्त स्थान आप सब कुछ, इस तरह से अपनी बुरा यूनिकोड पत्र सहित निकाल देते हैं सकता है:

>>> import re 
>>> country = u'FRANCE\ufeff' 
>>> clean_pattern = re.compile(u'[^A-Z ]+') 
>>> clean_pattern.sub('', country) 
u'FRANCE' 

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

+1

ओह, और यह श्वेतसूची विधि नियमित अभिव्यक्तियों का उपयोग करने तक ही सीमित नहीं है। यदि आप "किसी भी यूनिकोड वर्ण जो कि विराम चिह्न नहीं है" जैसे कुछ ठीक हैं, तो आप unicodedata.category (... के विरुद्ध वर्णों की जांच करने वाली स्ट्रिंग के माध्यम से पुन: प्रयास कर सकते हैं ...) कि पिनेटर ने सुझाव दिया। – Nathan

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