2011-10-03 161 views
14

我想知道如何實現一個函數get_words(),該函數返回列表中的字符串中的單詞,並去除標點符號。從字符串中提取單詞,刪除標點符號並用Python中的分隔單詞返回列表

我想如何實現它是將string.ascii_letters替換爲''並返回.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

我爲您格式化了您的問題。下次請使用'code'按鈕('{}')。 – Johnsyweb

回答

1

。所有你需要的是一個標記。看看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'] 

如果您不關心數字,與[A-Za-z]取代\w只是字母,或[A-Za-z']以包括收縮等。有可能更奇妙的方式包括字母非數字字符類(例如帶有重音的字母)與其他正則表達式。


我幾乎回答了這個問題在這裏:Split Strings with Multiple Delimiters?

但你的問題實際上是在指定的:你想'this is: an example'拆分成:

  • ['this', 'is', 'an', 'example']
  • ['this', 'is', 'an', '', 'example']

我認爲這是第一例。


[本, '是', '一',例如']是我想要的。有沒有導入正則表達式的方法?如果我們可以用''替換非ascii_letters,然後將字符串拆分成列表中的單詞,那麼這樣做會起作用嗎? - 詹姆斯史密斯2分鐘前

的正則表達式是最優雅的,但是,是的,你可以象下面這樣:

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()


旁註:你也可以請執行以下操作,但它需要導入另一個標準庫:

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

[this','is','an',example']就是我想要的。有沒有導入正則表達式的方法?如果我們可以用''替換非ascii_letters,然後將字符串拆分成列表中的單詞,那麼這樣做會起作用嗎? –

+0

我正在解析一個演講的數據集,並且有單詞中的縮寫,即'我們'和'他們',並且使用您的正則表達式也會將這些單詞與''字符分開。 – Peri461

+1

@ Peri461:你會修改正則表達式來包含'[\ w']'而不是'\ w',即「一個單詞是一個或多個字母或撇號」,而不是「一個單詞是一個或多個字母」。 – ninjagecko

相關問題