2011-06-10 13 views
5

मुझे अपने पायथन (2.7) स्क्रिप्ट में एक बग को समझने में कठिनाई हो रही है। मुझे विशेष पात्रों को पहचानने में सब और निष्कर्ष का उपयोग करने में अंतर हो रहा है।पायथन में नियमित अभिव्यक्तियां और यूनिकोड: उप और खोज के बीच अंतर

यहाँ कोड है:

>>> re.sub(ur"[^-'().,\w]+", '' , u'Castañeda', re.UNICODE) 
u'Castaeda' 
>>> re.findall(ur"[^-'().,\w]+", u'Castañeda', re.UNICODE) 
[] 

जब मैं findall उपयोग करते हैं, यह सही ढंग से एक अक्षरात्मक चरित्र के रूप में एन देखता है, लेकिन जब मैं उप का उपयोग यह प्रतिस्थापित कर देता है - एक गैर अक्षरात्मक चरित्र के रूप में यह इलाज।

मैं string.replace के साथ findall का उपयोग कर सही कार्यक्षमता प्राप्त करने में सक्षम हूं, लेकिन यह एक खराब समाधान की तरह लगता है। इसके अलावा, मैं re.split का उपयोग करना चाहता हूं, और मुझे re.sub के समान समस्याएं आ रही हैं।

सहायता के लिए अग्रिम धन्यवाद।

+0

आप किस संस्करण का उपयोग कर रहे हैं? यह Python 2.7.1 के आधार पर 2.7.1 – viraptor

+0

ActivePython 2.7.1.4 पर ठीक काम करता है। मुझे यह बताने के लिए धन्यवाद कि यह आपके लिए अच्छा काम करता है। मेरे इंस्टॉल के साथ कोई समस्या हो सकती है ... मैंने अभी इसे पायथन 2.6.4 पर कोशिश की है, जो मेरी मशीन पर भी है, और मुझे एक ही समस्या मिल रही है – user793061

+0

मैंने इसे क्यूबा से 11-24 पर कंसोल से परीक्षण किया। LANG = en_GB.UTF-8 के साथ शुरू किया गया, कोई एलसी प्रविष्टियां नहीं। – viraptor

उत्तर

7

re.sub की कॉल हस्ताक्षर है:

re.sub(pattern, repl, string, count=0) 

तो

re.sub(ur"[^-'().,\w]+", '' , u'Castañeda', re.UNICODE) 

re.UNICODE करने के लिए count, जो मूल्य 32.

है बजाय का प्रयास कर रहा है:

In [57]: re.sub(ur"(?u)[^-'().,\w]+", '', u'Castañeda') 
Out[57]: u'Casta\xf1eda' 

रेगेक्स की शुरुआत में (?u) रखकर रेगेक्स में re.UNICODE ध्वज निर्दिष्ट करने का एक वैकल्पिक तरीका है। आप इस तरह के अन्य झंडे (?iLmsux) भी सेट कर सकते हैं। (अधिक जानकारी के लिए क्लिक करें this link और के लिए खोज "(iLmsux)?"।)

इसी तरह, re.split की कॉल हस्ताक्षर है:

re.split(pattern, string, maxsplit=0) 

समाधान एक ही है।

+0

ऐसा लगता है कि इसे ठीक किया गया है! बहुत बहुत धन्यवाद! – user793061

+0

यदि आप यूनिकोड चरित्र गुण (जैसे '\ p {L} ') का उपयोग करना चाहते हैं तो आपको यह जानना होगा कि' re' इसका समर्थन नहीं करता है। http://pypi.python.org/pypi/regex करता है। – noisy

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