2011-10-03 16 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

@James宿題の場合は、質問に適切なタグを付けてください。 –

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分前

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


追記:あなたは可能性をも別の標準ライブラリをインポートする必要がありますが、次の操作を行います。

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 
    ] 

これは宿題であれば、2状態の有限状態マシンのような必須のものを探している可能性があります。状態は「最後の文字だった」とし、状態が文字 - >非-letterを入力すると単語が出力されます。それをしないでください。プログラムするのは良い方法ではありません(抽象化は便利ですが)。

+0

[this '、' is '、' an '、example']は私が望むものです。正規表現をインポートせずにメソッドがありますか?非ascii_lettersを ''で置き換えるだけで、その文字列をリスト内の単語に分割すると、それはうまくいくでしょうか? –

+0

私はスピーチのデータセットの解析に取り組んでいます。単語には収縮があります。つまり、we'reとthey'reです。regexpを使用すると、単語も '''文字で分割されます。 – Peri461

+1

@ Peri461:単語が1つ以上ではなく、単語が1つ以上の文字またはアポストロフィである、「\ w」ではなく「[\ w ']」を含むように正規表現を適応させます文字 "。 – ninjagecko

関連する問題