2011-05-31 17 views
40

मैं एक स्ट्रिंग को पायथन का उपयोग करके शब्दों की सूची में बदलने की कोशिश कर रहा हूं। मैं निम्नलिखित की तरह कुछ ले जाना चाहते हैं:शब्दों की सूची में एक स्ट्रिंग को परिवर्तित करना?

string = 'This is a string, with words!' 

फिर कुछ इस तरह करने के लिए कनवर्ट:

list = ['This', 'is', 'a', 'string', 'with', 'words'] 

सूचना विराम चिह्न और रिक्त स्थान की चूक। इस बारे में जाने का सबसे तेज़ तरीका क्या होगा?

उत्तर

52

इस प्रयास करें प्रतिस्थापन प्रतिलिपि द्वारा स्ट्रिंग। यदि पैटर्न नहीं मिला है, तो स्ट्रिंग अपरिवर्तित लौटा दी जाती है। प्रतिलिपि एक स्ट्रिंग या एक समारोह हो सकता है।

तो हमारे मामले में:

पैटर्न किसी भी गैर अक्षरांकीय चरित्र है।

[\ w] किसी भी अक्षरांकीय चरित्र का मतलब है और करने के लिए चरित्र Z तक [a-zA-Z0-9_]

एक सेट z, A के लिए,) 9 और अंडरस्कोर के बराबर है।

इसलिए हम किसी भी गैर अल्फान्यूमेरिक चरित्र से मेल खाते हैं और इसे एक स्थान से प्रतिस्थापित करते हैं।

और फिर हम विभाजित() यह जो अंतरिक्ष से स्ट्रिंग विभाजन और एक सूची में बदल देता है

तो 'हैलो दुनिया'

'दुनिया हैलो'

re.sub साथ हो जाता है

और फिर [ 'हैलो', 'दुनिया']

विभाजन के बाद

()

अगर कोई संदेह आती है तो मुझे बताएं।

+0

एस्ट्रोफ़ेस और हाइफ़न को भी संभालना याद रखें, क्योंकि उन्हें '\ w' में शामिल नहीं किया गया है। – Shule

+2

आप स्वरूपित एस्ट्रोफ़ेस और गैर-ब्रेकिंग हाइफ़न भी संभाल सकते हैं। – Shule

4

ठीक है, आप इस्तेमाल कर सकते हैं

import re 
list = re.sub(r'[.!,;?]', ' ', string).split() 

ध्यान दें कि string और list दोनों builtin प्रकार के नाम हैं, तो आप शायद अपने चर नाम के रूप में उन का उपयोग नहीं करना चाहते हैं। स्ट्रिंग में पैटर्न के सबसे बाईं ओर गैर-अतिव्यापी घटनाओं की जगह द्वारा प्राप्त

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

वापसी: डॉक्स से

: यह कैसे काम करता

import re 

mystr = 'This is a string, with words!' 
wordList = re.sub("[^\w]", " ", mystr).split() 

:

3

शब्दों के लिए नियमित अभिव्यक्ति आपको सबसे अधिक नियंत्रण प्रदान करेगी। आप ध्यान से विचार करना चाहते हैं कि "मैं हूं" जैसे डैश या एस्ट्रोफ़ेस वाले शब्दों से कैसे निपटें।

23

ऐसा करने के लिए यह काफी जटिल है। आपके शोध के लिए, इसे शब्द टोकननाइजेशन के रूप में जाना जाता है।आप बल्कि शून्य से शुरू की तुलना में, NLTK पर गौर करना चाहिए कि आप को देखने के लिए अन्य लोगों के क्या किया है चाहते हैं:

>>> import nltk 
>>> paragraph = u"Hi, this is my first sentence. And this is my second." 
>>> sentences = nltk.sent_tokenize(paragraph) 
>>> for sentence in sentences: 
...  nltk.word_tokenize(sentence) 
[u'Hi', u',', u'this', u'is', u'my', u'first', u'sentence', u'.'] 
[u'And', u'this', u'is', u'my', u'second', u'.'] 
11

संपूर्णता के लिए string.punctuation का उपयोग करना:

import re 
import string 
x = re.sub('['+string.punctuation+']', '', s).split() 

यह रूप में अच्छी तरह नई-पंक्तियों को संभालती है।

+1

स्वीकार्य anwser होना चाहिए। – Epoc

11

सबसे आसान तरीका:

>>> import re 
>>> string = 'This is a string, with words!' 
>>> re.findall(r'\w+', string) 
['This', 'is', 'a', 'string', 'with', 'words'] 
41

मुझे लगता है कि यह किसी और को इस पोस्ट पर ठोकर देर प्रतिक्रिया दी के लिए सबसे आसान तरीका है:

>>> string = 'This is a string, with words!' 
>>> string.split() 
['This', 'is', 'a', 'string,', 'with', 'words!'] 
+19

आपको शब्दों से विराम चिह्न को अलग और खत्म करने की आवश्यकता है (उदा।, "स्ट्रिंग," और "शब्द!")। चूंकि, यह ओपी की आवश्यकताओं को पूरा नहीं करता है। – Levon

-2

आप कोशिश करते हैं और ऐसा कर सकते हैं:

tryTrans = string.maketrans(",!", " ") 
str = "This is a string, with words!" 
str = str.translate(tryTrans) 
listOfWords = str.split() 
0

यह कोडिंग चुनौती पर मेरे प्रयास से है जो रेगेक्स,

का उपयोग नहीं कर सकता
outputList = "".join((c if c.isalnum() or c=="'" else ' ') for c in inputStr).split(' ') 

एस्ट्रोफ़े की भूमिका दिलचस्प लगती है।

1

@ mtrw के जवाब से प्रेरित होकर, लेकिन केवल शब्द सीमाओं पर विराम चिह्न को निकाल देते हैं करने के लिए सुधार:

import re 
import string 

def extract_words(s): 
    return [re.sub('^[{0}]+|[{0}]+$'.format(string.punctuation), '', w) for w in s.split()] 

>>> str = 'This is a string, with words!' 
>>> extract_words(str) 
['This', 'is', 'a', 'string', 'with', 'words'] 

>>> str = '''I'm a custom-built sentence with "tricky" words like https://stackoverflow.com/.''' 
>>> extract_words(str) 
["I'm", 'a', 'custom-built', 'sentence', 'with', 'tricky', 'words', 'like', 'https://stackoverflow.com'] 
0

इस तरह आप वर्णमाला के बाहर हर विशेष वर्ण को खत्म:

def wordsToList(strn): 
    L = strn.split() 
    cleanL = [] 
    abc = 'abcdefghijklmnopqrstuvwxyz' 
    ABC = abc.upper() 
    letters = abc + ABC 
    for e in L: 
     word = '' 
     for c in e: 
      if c in letters: 
       word += c 
     if word != '': 
      cleanL.append(word) 
    return cleanL 

s = 'She loves you, yea yea yea! ' 
L = wordsToList(s) 
print(L) # ['She', 'loves', 'you', 'yea', 'yea', 'yea'] 

मुझे यकीन नहीं है कि यह तेजी से या इष्टतम या प्रोग्राम के लिए सही तरीका है।

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