22

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

>>> import re 
>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/xmas/xmas1.jpg') 
>>> print m.groupdict() 
{'tag': 'xmas', 'filename': 'xmas1.jpg'} 

सब कुछ ठीक है, तो मैं में नार्वे पात्रों के साथ कुछ कोशिश यह (या कुछ और अधिक यूनिकोड की तरह):

>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg') 
>>> print m.groupdict() 
Traceback (most recent call last): 
File "<interactive input>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'groupdict' 

मैं ठेठ यूनिकोड वर्ण कैसे मिलान कर सकते हैं, øæå की तरह? मैं उपरोक्त टैग-समूह और फ़ाइल नाम के लिए दोनों पात्रों से मिलान करने में सक्षम होना चाहता हूं।

+0

सुनिश्चित करें कि आप [सामान्य] (https करें: //docs.python.org/2/library/unicodedata.html#unicodedata.normalize) अपने स्ट्रिंग्स क्योंकि एक ही दृश्य अनुकूलता उत्पन्न करने वाले भिन्न कोडपॉइंट-अनुक्रम होते हैं। – janbrohl

उत्तर

38

आप re.UNICODE झंडा, और इनपुट एक यूनिकोड स्ट्रिंग u उपसर्ग का उपयोग करके के रूप में अपने स्ट्रिंग निर्दिष्ट करने की आवश्यकता पायथन 2 में; पायथन 3 में आपको u छोड़ना होगा क्योंकि सभी तार यूनिकोड हैं।

+1

+1 के लिए +1: और यूआर उपसर्ग का उपयोग कर अपनी स्ट्रिंग को यूनिकोड स्ट्रिंग के रूप में इनपुट करें – Tamm

9

आप UNICODE ध्वज की जरूरत है:

>>> re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', u'/by_tag/påske/øyfjell.jpg', re.UNICODE).groupdict() 
{'tag': u'p\xe5ske', 'filename': u'\xf8yfjell.jpg'} 

यह वह जगह है:

m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg', re.UNICODE) 
+2

क्या यह Python3 के लिए भी आवश्यक है? – Kevin

5

अजगर 2 में, आप re.UNICODE झंडा और unicode स्ट्रिंग निर्माता

>>> re.sub(r"[\w]+","___",unicode(",./hello-=+","utf-8"),flags=re.UNICODE) 
u',./___-=+' 
>>> re.sub(r"[\w]+","___",unicode(",./cześć-=+","utf-8"),flags=re.UNICODE) 
u',./___-=+' 
>>> re.sub(r"[\w]+","___",unicode(",./привет-=+","utf-8"),flags=re.UNICODE) 
u',./___-=+' 
>>> re.sub(r"[\w]+","___",unicode(",./你好-=+","utf-8"),flags=re.UNICODE) 
u',./___-=+' 
>>> re.sub(r"[\w]+","___",unicode(",./你好,世界-=+","utf-8"),flags=re.UNICODE) 
u',./___\uff0c___-=+' 
>>> print re.sub(r"[\w]+","___",unicode(",./你好,世界-=+","utf-8"),flags=re.UNICODE) 
,./___,___-=+ 

जरूरत है (उत्तरार्द्ध मामले में, अल्पविराम चीनी अल्पविराम है।)