2011-10-03 15 views
14

में अलग-अलग शब्दों के साथ एक सूची लौटने पर मैं सोच रहा था कि फ़ंक्शन get_words() फ़ंक्शन को कैसे कार्यान्वित किया जाए, जो विराम चिह्न को अलग करते हुए एक स्ट्रिंग में शब्दों को वापस लाता है।स्ट्रिंग से शब्दों को निकालने, विराम चिह्न को हटाने और पाइथन

मैं इसे कैसे लागू करना चाहता हूं '' के साथ प्रतिस्थापित करें और .split() लौटाएं।

def get_words(text): 

    '''The function should take one argument which is a string''' 

    returns text.split() 

उदाहरण के लिए:

>>>get_words('Hello world, my name is...James!') 

रिटर्न:

>>>['Hello', 'world', 'my', 'name', 'is', 'James'] 
+0

मैंने आपके लिए अपना प्रश्न स्वरूपित किया। कृपया अगली बार 'कोड' बटन (' {} ') का उपयोग करें। – Johnsyweb

उत्तर

1

.सभी आप की जरूरत एक tokenizer है। nltk पर और विशेष रूप से WordPunctTokenizer पर एक नज़र डालें।

9

re उपयोग करने के लिए प्रयास करें:

>>> [w for w in re.split('\W', 'Hello world, my name is...James!') if w] 
['Hello', 'world', 'my', 'name', 'is', 'James'] 

हालांकि मुझे यकीन है कि यह आपके सभी उपयोग के मामलों पकड़ेगा नहीं हूँ।

यदि आप किसी अन्य तरीके से हल करना चाहते हैं, तो आप अक्षर हैं जो आप परिणाम में रहना चाहता हूँ निर्दिष्ट कर सकता है:

>>> re.findall('[%s]+' % string.ascii_letters, 'Hello world, my name is...James!') 
['Hello', 'world', 'my', 'name', 'is', 'James'] 
+0

string.ascii_letters का उपयोग कर ऐसा करने का कोई तरीका है? –

+5

@ जेम्स यदि यह होमवर्क है, तो उचित प्रश्न के साथ अपना प्रश्न चिह्नित करें। –

31

इस बंटवारे और विराम चिह्न के साथ कोई संबंध नहीं है; तुम सिर्फ पत्र (और संख्या) के बारे में परवाह है, और सिर्फ एक नियमित अभिव्यक्ति हैं:

import re 
def getWords(text): 
    return re.compile('\w+').findall(text) 

डेमो:

>>> re.compile('\w+').findall('Hello world, my name is...James the 2nd!') 
['Hello', 'world', 'my', 'name', 'is', 'James', 'the', '2nd'] 

आप संख्या के बारे में परवाह नहीं करते हैं, \w[A-Za-z] के साथ सिर्फ पत्र के लिए की जगह , या संकुचन, आदि शामिल करने के लिए [A-Za-z'] आदि। संभवतः अन्य रेगेक्स के साथ वर्णमाला-गैर-न्यूमेरिक वर्ण वर्ग (जैसे उच्चारण के साथ अक्षरों) को शामिल करने के लिए प्रशंसनीय तरीके हैं।


मैं लगभग इस सवाल का जवाब यहां: Split Strings with Multiple Delimiters?

लेकिन अपने प्रश्न के तहत निर्दिष्ट वास्तव में है:

  • ['this', 'is', 'an', 'example']
  • या ['this', 'is', 'an', '', 'example']: यदि आप चाहते 'this is: an example' में विभाजित किया जा करने के लिए है?

मुझे लगता है कि यह पहला मामला था।


मैं क्या चाहते है [इस ',' ',' 'एक, उदाहरण' है]। रेगेक्स आयात किए बिना कोई तरीका है? यदि हम केवल non ascii_letters को '' के साथ प्रतिस्थापित कर सकते हैं, तो स्ट्रिंग को शब्दों में शब्दों में विभाजित कर सकते हैं, क्या यह काम करेगा? - जेम्स स्मिथ 2 मिनट पहले

regexp सबसे सुंदर है, लेकिन हाँ, तो आप इस प्रकार है के रूप में कर सकता है:

def getWords(text): 
    """ 
     Returns a list of words, where a word is defined as a 
     maximally connected substring of uppercase or lowercase 
     alphabetic letters, as defined by "a".isalpha() 

     >>> get_words('Hello world, my name is... Élise!') # works in python3 
     ['Hello', 'world', 'my', 'name', 'is', 'Élise'] 
    """ 
    return ''.join((c if c.isalnum() else ' ') for c in text).split() 

या .isalpha()


Sidenote: आप भी कर सकते थे निम्न कार्य करें, हालांकि इसे एक और मानक लाइब्रेरी आयात करने की आवश्यकता है:

from itertools import * 

# groupby is generally always overkill and makes for unreadable code 
# ... but is fun 

def getWords(text): 
    return [ 
     ''.join(chars) 
      for isWord,chars in 
      groupby(' My name, is test!', lambda c:c.isalnum()) 
      if isWord 
    ] 

यदि यह गृहकार्य है, तो शायद वे दो राज्यीय फिनिट स्टेट मशीन की तरह एक अनिवार्य चीज़ की तलाश कर रहे हैं जहां राज्य "आखिरी चरित्र एक पत्र था" और यदि राज्य पत्र -> गैर -जलेटर तो आप एक शब्द आउटपुट करते हैं। ऐसा मत करो; यह प्रोग्राम के लिए एक अच्छा तरीका नहीं है (हालांकि कभी-कभी अमूर्तता उपयोगी होती है)।

+0

[यह ',' है ',' ए ', उदाहरण'] जो मैं चाहता हूं। रेगेक्स आयात किए बिना कोई तरीका है? यदि हम केवल non ascii_letters को '' के साथ प्रतिस्थापित कर सकते हैं, तो स्ट्रिंग को शब्दों में शब्दों में विभाजित कर सकते हैं, क्या यह काम करेगा? –

+0

मैं भाषणों के डेटासेट को पार्स करने पर काम कर रहा हूं, और शब्दों में संकुचन हैं, यानी हम '' हैं 'और' वे 'हैं, और आपके regexp का उपयोग करके' 'अक्षर' वाले शब्दों को भी विभाजित किया गया है। – Peri461

+1

@ पेरी 461: आप रेगेक्सपी को '\ w'] के बजाय '[\ w'] 'रखने के लिए अनुकूलित करेंगे, यानी "एक शब्द एक या अधिक अक्षर-या-apostrophes" है, "एक शब्द एक या अधिक है पत्र "। – ninjagecko

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