2010-08-18 14 views
8

मैं एक फ़िल्टर कर रहा हूं जिसमें मैं जांचता हूं कि एक यूनिकोड (utf-8 एन्कोडिंग) स्ट्रिंग में कोई अपरकेस वर्ण नहीं है (सभी भाषाओं में)। यह मेरे साथ ठीक है अगर स्ट्रिंग में कोई भी कैस्ड कैरेक्टर नहीं है।पायथन: कैसे जांचें कि यूनिकोड स्ट्रिंग में एक कैस्ड कैरेक्टर है या नहीं?

उदाहरण के लिए: 'हैलो!' फिल्टर पास नहीं करेगा, लेकिन "!" फ़िल्टर को पास करना चाहिए, क्योंकि "!" एक cased चरित्र नहीं है।

मैंने आइसोवर() विधि का उपयोग करने की योजना बनाई, लेकिन ऊपर दिए गए उदाहरण में, "!"। Islower() झूठी वापसी करेगा।

पायथन डॉक्स के अनुसार, "पाइथन यूनिकोड विधि islower() सही लौटाता है अगर यूनिकोड स्ट्रिंग के कैज्ड वर्ण सभी लोअरकेस हैं और स्ट्रिंग में कम से कम एक cased चरित्र होता है, अन्यथा, यह गलत होता है।"

चूंकि स्ट्रिंग में किसी भी प्रकार का कैरेक्टर नहीं होता है, यानी विधि भी गलत होती है। "!", मैं जांच करना चाहता हूं कि स्ट्रिंग में कोई भी कैस्ड कैरेक्टर है या नहीं।

इस तरह कुछ ....

string = unicode("[email protected]#$%^", 'utf-8') 

#check first if it contains cased characters 
if not contains_cased(string): 
    return True 

return string.islower(): 

एक contains_cased() फ़ंक्शन के लिए कोई सुझाव?

या शायद एक अलग कार्यान्वयन दृष्टिकोण?

धन्यवाद!

+0

आपके द्वारा स्वीकार किया गया उत्तर गलत प्रतीत होता है। मेरा जवाब देखें –

उत्तर

6

Here यूनिकोड वर्ण श्रेणियों पर पूर्ण स्कूप है।

पत्र श्रेणियों में शामिल हैं:

Ll -- lowercase 
Lu -- uppercase 
Lt -- titlecase 
Lm -- modifier 
Lo -- other 

ध्यान दें कि Ll <-> islower(); इसी प्रकार Lu के लिए; (Lu or Lt) <-> istitle()

आप आवरण पर जटिल चर्चा को पढ़ना चाहेंगे, जिसमें Lm अक्षरों की कुछ चर्चा शामिल है।

कैंड के रूप में सभी "अक्षरों" का अंधेरा व्यवहार करना राक्षसी रूप से गलत है।Lo श्रेणी में बीएमपी में 45301 कोडपॉइंट शामिल हैं (पायथन 2.6 का उपयोग करके गिना जाता है)। इनमें से एक बड़ा हिस्सा हंगुल सिलेबल्स, सीजेके आइडियोग्राफ, और अन्य पूर्वी एशियाई पात्र होंगे - यह समझना बहुत कठिन होगा कि उन्हें "cased" माना जा सकता है।

आप अपेक्षाकृत "इच्छित वर्ण" के (अनिर्दिष्ट) व्यवहार के आधार पर वैकल्पिक परिभाषा पर विचार करना चाहेंगे। यहाँ एक सरल पहला प्रयास है:

>>> cased = lambda c: c.upper() != c or c.lower() != c 
>>> sum(cased(unichr(i)) for i in xrange(65536)) 
1970 
>>> 

दिलचस्प बात यह है वहाँ 1216 x जाएगा और 937 x लू, 2153 की कुल रहे हैं ...आगे की जांच के लिए दायरा एलएल और लू वास्तव में क्या मतलब है।

+0

@ जॉन: वाह। आपके विवरण के लिये धन्यवाद। इसे समझने में मुझे कुछ समय लगा। मैंने आपके लिंक पर एक नज़र डाली, और मुझे लगता है कि मुझे इसे अधिक व्यापक रूप से पढ़ना है। मुझे एहसास है कि जो मुझे पता चल रहा है वह मुझे अपना बहुत सारे कोड ओवरहाल करने जा रहा है। ओह। धन्यवाद! – Albert

+0

@ अल्बर्ट: घबराओ मत। जैसा कि मैंने संकेत दिया है, सबसे पहले "cased" से आपका क्या मतलब है इसकी परिभाषा विकसित करें। बिना छेड़छाड़ के विरोध के रूप में आप cased chars पर क्या अलग-अलग उपचार लागू करेंगे? मेरी उदाहरण परिभाषा "char जिसमें एक अपरकेस या लोअरकेस 'पार्टनर है"। 1 9 70 के वर्णों और 2153 के बीच के अंतर के कुछ (शायद सभी) वर्णों के कारण होते हैं जिन्हें 'एलएल' के रूप में वर्गीकृत किया जाता है क्योंकि वे लोअरकेस चरित्र की तरह दिखते हैं, लेकिन उनके पास 'लू' साझेदार नहीं है, और इसके विपरीत - आपको यह तय करने की ज़रूरत है कि क्या आपके उद्देश्यों के लिए ये "बंद" हैं। बीटीडब्ल्यू आप अपना स्वीकार्य उत्तर बदल सकते हैं :-) –

+0

@ जॉन: ठीक है, मैं वास्तव में अपनी वेब सेवा के लिए एक एपीआई बना रहा हूं। मेरी webservice एक कुंजी स्वीकार करता है जो मेरे डेटाबेस में एक विशिष्ट रिकॉर्ड के लिए मानचित्र बनाता है। कुंजी केस-संवेदी है, और कुंजी किसी भी यूनिकोड विशेषताकार से बनायी जा सकती है। तो सभी इनपुट को सामान्य करने के लिए, मैं सभी प्रमुख प्रश्नों को लोअरकेस में परिवर्तित कर दूंगा (यदि उनके पास अपरकेस समकक्ष हैं)। इसका एक परिणाम यह है कि जब मैं रिकॉर्ड कुंजी (जो मेरे उपयोगकर्ता अनुकूलित कर सकते हैं) बनाते हैं, तो मैं किसी भी अपरकेस वर्ण को स्वीकार नहीं कर सकता जिसे कि लोअर() फ़ंक्शन के बराबर लोअरकेस में परिवर्तित किया जा सकता है। तो मैं इसके लिए एक फ़िल्टर बनाने की कोशिश कर रहा हूँ। कोई सुझाव? – Albert

7
import unicodedata as ud 

def contains_cased(u): 
    return any(ud.category(c)[0] == 'L' for c in u) 
+0

Arg alex, क्या ऐसा कुछ है जिसे आप नहीं जानते? –

+2

-1 पूर्व एशियाई पात्रों को "cased" के रूप में मानता है। मेरा जवाब देखें –

+0

+1: कामकाजी समाधान (जॉन माचिन के निष्पादन योग्य कोड के बिना अच्छी व्याख्या के मुकाबले) – oDDsKooL

1

उपयोग मॉड्यूल unicodedata,

unicodedata.category(character) 

रिटर्न छोटे अक्षरों के लिए "Ll" और अपरकेस लोगों के लिए "Lu"।

here आप यूनिकोड चरित्र श्रेणियों की सूची पा सकते हैं

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