2009-03-15 18 views
11

मैं अलग-अलग वर्णों के साथ व्हाइट्स का उपयोग करके विशेष वर्णों के साथ एक वाक्य वाली सही स्ट्रिंग को कैसे विभाजित कर सकता हूं? रेगेक्स स्प्लिट विधि का उपयोग करके मैं वांछित परिणाम प्राप्त नहीं कर सकता।पायथन, रेगेक्स स्प्लिट और विशेष चरित्र

उदाहरण कोड:

# -*- coding: utf-8 -*- 
import re 


s="La felicità è tutto" # "The happiness is everything" in italian 
l=re.compile("(\W)").split(s) 

print " s> "+s 
print " wordlist> "+str(l) 
for i in l: 
    print " word> "+i 

उत्पादन होता है:

s> La felicità è tutto 
wordlist> ['La', ' ', 'felicit', '\xc3', '', '\xa0', '', ' ', '', '\xc3', '', '\xa8', '', ' ', 'tutto'] 
word> La 
word> 
word> felicit 
word> Ã 
word> 
word> ? 
word> 
word> 
word> 
word> Ã 
word> 
word> ? 
word> 
word> 
word> tutto 

जब मैं की तरह एक उत्पादन के लिए देख रहा हूँ:

s> La felicità è tutto 
wordlist> ['La', ' ', 'felicità', ' ', 'è', ' ', 'tutto'] 
word> La 
word> 
word> felicità 
word> 
word> è 
word> 
word> tutto 

उल्लेखनीय है कि एस एक स्ट्रिंग है जिसे किसी अन्य विधि से वापस किया जाता है, इसलिए मैं

01 जैसे एन्कोडिंग को मजबूर नहीं कर सकता
s=u"La felicità è tutto" 

यूनिकोड और reg-ex के आधिकारिक पायथन दस्तावेज़ पर मुझे एक संतोषजनक स्पष्टीकरण नहीं मिला है।

धन्यवाद।

Alessandro

+1

आप गैर-शब्द वर्णों पर विभाजित हैं, जिसमें न केवल रिक्त स्थान शामिल हैं, बल्कि (स्पष्ट रूप से) उच्चारण वर्ण भी हैं। – mpen

उत्तर

16

आपका regex (\s) के बजाय इस तरह (\W) होना चाहिए:

l = re.compile("(\s)").split(s) 

ऊपर कोड आप सटीक उत्पादन का अनुरोध आपने किया दे देंगे।

l = re.compile("\s").split(s) 

जो खाली स्थान के पात्रों पर विभाजित है और आप मेल के रूप में सभी रिक्त स्थान नहीं देता है: हालांकि निम्न पंक्ति अधिक समझ में आता है। आपको उनकी आवश्यकता हो सकती है हालांकि मैंने दोनों उत्तरों पोस्ट किए हैं।

+0

धन्यवाद, यह एकल शब्दों के प्रिंट पर काम करता है। क्यों सूची के प्रिंट में डीकोडेड वर्णों के बजाय यूनिकोड हेक्स कोड शामिल है? – alexroat

+0

ऐसा इसलिए है कि आउटपुट वैध पायथन कोड है जिसे आप कॉपी और पेस्ट कर सकते हैं ... और चूंकि आप गैर-यूनिकोड वातावरण में काम कर रहे हैं, यह संभवतः सबसे पोर्टेबल तरीके से आउटपुट करता है। – porges

+0

धन्यवाद एंड्रयू। आपने मेरे सभी संदेहों का पूरी तरह उत्तर दिया। – alexroat

4

नियमित अभिव्यक्ति के लिए एक एन्कोडिंग को परिभाषित करने का प्रयास करें:

l=re.compile("\W", re.UNICODE).split(s) 
+0

यह काम नहीं करता है, मैंने पहले से ही कोशिश की है ... हालांकि एंड्रयू हरे का समाधान अच्छी तरह से काम करता है। – alexroat

+0

क्या आपने ब्रांड्स के बिना कोशिश की है? – kgiannakakis

+0

हां, लेकिन व्यवहार स्ट्रिंग विभाजन की तरह है (यह सफेद जगहों को हटा देता है) और मैं उन्हें बनाए रखना चाहता हूं। हालांकि re.UNICODE कुछ वर्णों को एन्कोडिंग के साथ गड़बड़ कर देता है। – alexroat

3

मुझे लगता है कि इस मामले में एक regexp उपयोग करने के लिए overkill है। केवल एक चीज आप क्या करना चाहते खाली स्थान के पात्रों पर स्ट्रिंग विभाजित है मैं स्ट्रिंग

s = 'La felicità è tutto' 
words = s.split() 
+0

मेरा इरादा सूची में सफेद जगहों को बनाए रखना है, इसलिए स्ट्रिंग स्प्लिट इसके लिए सहायक नहीं है क्योंकि यह सफेद जगहों को हटा देता है और रेगेक्स विभाजन के रूप में पूरी तरह कॉन्फ़िगर करने योग्य नहीं है। – alexroat

+0

@alexroat: आपको रिक्त स्थान की बिल्कुल आवश्यकता क्यों है? आप जानते हैं कि प्रत्येक शब्द (सूची वस्तु) के बीच होने वाली घटना, क्या आपके पास एल्गोरिदम उन्हें आवश्यकतानुसार वापस जोड़ नहीं सकता है? – mpen

0

खैर, एंड्रयू हरे जवाब पर कुछ और परीक्षणों के बाद मैं के रूप में उस चरित्र को देखा है पर split विधि का उपयोग की सलाह देते हैं () [] - और इतने पर विभाजक के रूप में नहीं माना जाता है, जबकि मैं अल्फान्यूमेरिकल वैल्यू सेट के संयोजन से बना शब्दों में एक वाक्य (सभी विभाजक को बनाए रखना) को विभाजित करना चाहता हूं, अंत में एक्सेंट किए गए वर्णों के साथ विस्तारित होता है (यानी, यूनिकोड में अल्फान्यूमेरिक के रूप में चिह्नित सबकुछ)। तो, kgiannakakis का समाधान अधिक सही है लेकिन यह स्ट्रिंग एस के रूपांतरण को यूनिकोड प्रारूप में याद करता है।

पहला उदाहरण की इस विस्तार लें:

# -*- coding: utf-8 -*- 
import re 
s="(La felicità è tutto)"#no explicit unicode given string (UTF8) 
l=re.compile("([\W])",re.UNICODE).split(unicode(s,'utf-8'))#split on s converted to unicode from utf8 

print " string> "+s 
print " wordlist> "+str(l) 
for i in l: 
    print " word> "+i 

उत्पादन अब है:

string> (La felicità è tutto) 
wordlist> [u'', u'(', u'La', u' ', u'felicit\xe0', u' ', u'\xe8', u' ', u'tutto', u')', u''] 
word> 
word> (
word> La 
word> 
word> felicità 
word> 
word> è 
word> 
word> tutto 
word>) 
word> 

है कि मैं वास्तव में क्या देख रहा हूँ।

चीयर्स :)

Alessandro

3

एक यूनिकोड रेगुलर एक्सप्रेशन के उपयोग के लिए काम करेंगे, तो आप इसे एक यूनिकोड तार के साथ शुरू करने के लिए (जो आपके द्वारा दी गई उदाहरण में नहीं है) देने के प्रदान की है। इस प्रयास करें:

s=u"La felicità è tutto" # "The happiness is everything" in italian 
l=re.compile("(\W)",re.UNICODE).split(s) 

print " s> "+s 
print " wordlist> "+str(l) 
for i in l: 
    print " word> "+i 

परिणाम:

s> La felicità è tutto 
wordlist> [u'La', u' ', u'felicit\xe0', u' ', u'\xe8', u' ', u'tutto'] 
word> La 
word> 
word> felicità 
word> 
word> è 
word> 
word> tutto 

आपका स्ट्रिंग s एक str प्रकार के रूप में बनाई गई है, और शायद utf-8 कोडिंग, जो यूनिकोड से अलग है में हो जाएगा।

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