2012-03-21 18 views
5

का उपयोग करके विभिन्न विराम चिह्नों पर एक स्ट्रिंग को विभाजित करना मैं एक स्ट्रिंग को शब्दों में विभाजित करने, रिक्त स्थान और विराम चिह्नों को हटाने की कोशिश कर रहा हूं।विभाजन()

मैं split() विधि का उपयोग करने की कोशिश की, एक ही बार में सभी विराम गुजर, लेकिन मेरी परिणाम गलत थे:

>>> test='hello,how are you?I am fine,thank you. And you?' 
>>> test.split(' ,.?') 
['hello,how are you?I am fine,thank you. And you?'] 

मैं वास्तव में कैसे पहले से ही regexes के साथ ऐसा करना पता है, लेकिन मैं यह पता लगाने के लिए करना चाहते split() का उपयोग करके इसे कैसे करें। कृपया मुझे एक रेगेक्स समाधान न दें।

+2

तो आप एक नाखून चलाने के लिए एक रिंच का उपयोग करने पर जोर देते हैं, जबकि हथौड़ा हाथ में है। क्यूं कर? –

+0

ओपी के लिए कोई अपमान नहीं है, मुझे लगता है कि इस तरह के प्रश्नों के लिए एक टैग होना चाहिए जिसमें पर्याप्त उपकरण किसी भी कारण (कभी-कभी मान्य) के लिए स्नब किया जाता है, वे समय-समय पर आते हैं। शायद 'लुडिज्म'? –

+0

सी # "हैलो, आप कैसे हैं? मैं ठीक हूँ, धन्यवाद। और आप?" स्प्लिट (",?।"। ToCharArray(), StringSplitOptions.RemoveEmptyEntries); –

उत्तर

10

यह सबसे अच्छा तरीका है मैं के बारे में सोच सकते हैं फिर से मॉड्यूल का उपयोग किए बिना है आप .split() के उपयोग का विस्तार करने के एक समारोह लिख सकते हैं:

def multi_split(s, seprators): 
    buf = [s] 
    for sep in seprators: 
     for loop, text in enumerate(buf): 
      buf[loop:loop+1] = [i for i in text.split(sep) if i] 
    return buf 

और यह प्रयास करें:

>>> multi_split('hello,how are you?I am fine,thank you. And you?', ' ,.?') ['hello', 'how', 'are', 'you', 'I', 'am', 'fine', 'thank', 'you', 'And', 'you']

यह और अधिक स्पष्ट हो जाएगा और अन्य स्थितियों में इस्तेमाल किया जा सकता है।

+0

ओउ, यह करने का एक और तरीका है, हालांकि यह विभाजित वर्णों की स्पष्ट सूची का उपयोग नहीं करता है ... – larsks

+0

आपका कोड बेहतर है, यह अन्य विराम चिह्नों को नियंत्रित कर सकता है – leisurem

+0

यह बहुत अच्छा है। हालांकि, re.split का उपयोग करने की तुलना में यह थोड़ा कम कुशल है। –

11

आप कई सीमांकक, अपने उदाहरण के रूप में, तो आप इस तरह, अपने विचित्र आपत्तियों के बावजूद re मॉड्यूल का उपयोग करने की आवश्यकता के लिए जा रहे आधार पर एक स्ट्रिंग को विभाजित करना चाहते हैं:

>>> re.split('[?.,]', test) 
['hello', 'how are you', 'I am fine', 'thank you', ' And you', ''] 

यह split का उपयोग कर एक समान परिणाम प्राप्त करने के लिए, लेकिन आपको प्रत्येक चरित्र के लिए एक बार विभाजित करने की आवश्यकता है, और आपको पिछले विभाजन के परिणामों पर पुन: प्रयास करने की आवश्यकता है। यह काम करता है, लेकिन यह यू-ग-एल-y है:

>>> sum([z.split() 
... for z in sum([y.split('?') 
... for y in sum([x.split('.') 
... for x in test.split(',')],[])], [])], []) 
['hello', 'how', 'are', 'you', 'I', 'am', 'fine', 'thank', 'you', 'And', 'you'] 

यह sum() का उपयोग करता सूची पिछले यात्रा से वापस लौटे समतल।

test.replace(',',' ').replace('.',' ').replace('?',' ').split() 
+0

कृपया सूचियों की सूचियों को फ़्लैट करने के लिए 'sum()' का उपयोग न करें - [इस उद्देश्य के लिए यह गलत टूल है] (http://stackoverflow.com/questions/952914/making-a-flat-list-out- की सूची-सूचियों में अजगर की/952,952 # 952,952)। इस विशेष मामले में और भी, क्योंकि [नेस्टेड लूप का उपयोग करके एक एकल सूची समझ] [http://ideone.com/xEXX7) पहली जगह में फ़्लैट करने की आवश्यकता को खत्म कर देगी। –

+0

यदि आप मानते हैं कि यह समस्या के लिए अधिक उपयुक्त है तो आप वैकल्पिक समाधान पोस्ट करने के लिए स्वागत से अधिक हैं। – larsks

+0

जब तक ओपी यह नहीं समझाता कि क्यों 're' का उपयोग नहीं किया जाना चाहिए, मैं जवाब नहीं दूंगा, क्योंकि मैं अभी तक प्रश्न के उद्देश्य को समझ नहीं पा रहा हूं। मेरी आखिरी टिप्पणी में दूसरा लिंक एक वैकल्पिक समाधान दिखाता है, हालांकि। –

6

जब से तुम फिर से मॉड्यूल का उपयोग नहीं करना चाहते हैं, तो आप इस का उपयोग कर सकते हैं:

+0

परीक्षण = 'हैलो, आप कैसे हैं? मैं ठीक हूँ, धन्यवाद। और आप?' परीक्षा में एक्स के लिए : नहीं तो x.isalpha(): परीक्षण = test.replace (एक्स, '') परीक्षण = test.split() प्रिंट परीक्षण – leisurem

3

:

"".join((char if char.isalpha() else " ") for char in test).split() 
3

larsks 'जवाब है, जहां आप सभी विराम चिह्न वर्ण अपने आप को टाइप करने के लिए की जरूरत नहीं है की एक संशोधित संस्करण: necroing के लिए

import re, string 

re.split("[" + string.punctuation + "]+", test) 
['hello', 'how are you', 'I am fine', 'thank you', ' And you', ''] 
0

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

कोड की बात नहीं पुस्तकालयों (और यह बड़ी फ़ाइलों पर जल्दी हो जाता है) का उपयोग करने के लिए है:

sentence = "George Bernard-Shaw was a fine chap, I'm sure - who can really say?" 
alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 
words = [] 
word = "" 
mode = 0 
for ch in sentence: 
    if mode == 1: 
     words.append(word) 
     word = "" 
     mode = 0 
    if ch in alpha or ch == "'" or ch == "-": 
     word += ch 
    else: 
     mode = 1 
words.append(word) 
print(words) 

आउटपुट:

['George', 'Bernard-Shaw', 'was', 'a', 'fine', 'chap', "I'm", 'sure', '-', 'who', 'can', 'really', 'say'] 

मैं सचमुच के बारे में आधे घंटे में यह लिखा है तो मुझे यकीन है कि तर्क साफ किया जा सकता है।मैंने यह भी स्वीकार किया है कि इसे हाइफ़न जैसे गुफाओं से निपटने के लिए अतिरिक्त तर्क की आवश्यकता हो सकती है, क्योंकि उनका उपयोग एक उल्टा कॉमा की तरह कुछ की तुलना में असंगत है। क्या कोई मॉड्यूल है, वास्तव में, यह वैसे भी सही तरीके से कर सकता है?

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