2011-12-17 26 views
0

正規表現を使って単語列を単語リストに分割しようとしています。私はまだ正規表現の初心者です。句読点を含む句読点の後に文字列を分割する

私はnltk.regex_tokenizeを使用しています。これは近い結果を出すものですが、私が望むものではありません。

これは私がこれまで持っているものです。

>>> import re, codecs, nltk 
>>> sentence = "détesté Rochard ! m'étais à... 'C'est hyper-cool.' :) :P"  
>>> pattern = r"""(?x) 
    #words with internal hyphens 
    | \w+(-\w+)* 
    #ellipsis 
    | \.\.\. 
    #other punctuation tokens 
    | [][.,;!?"'():-_`] 
    """ 
>>> nltk.regexp_tokenize(sentence.decode("utf8"), pattern) 
[u'd\xe9test\xe9', u'Rochard', u'!', u'm', u"'", u'\xe9tais', u'\xe0', u'qu', u"'", u'on', u'...', u"'", u'C', u"'", u'est', u'hyper-cool', u'.', u"'", u':', u')', u':', u'P'] 

次のように私は出力を持っているしたいと思います:

[u'd\xe9test\xe9', u'Rochard', u'!', u"m'", u'\xe9tais', u'\xe0', u"qu'", u'on', u'...', u"'", u"C'", u'est', u'hyper-cool', u'.', u"'", u':)', u':P'] 

私は「顔文字」の回避策を持っているので、私は「何最も関心のあるのは引用符です。

答えて

1

所望の出力があなたの入力文

  1. [u"qu'", u'on']と一致していないようです。私がやったところ、これらの2つの試合は、あなたの文章から決定したから把握することはできません
  2. なぜu'.'
  3. がなかった部分 u'hyper-cool'の(あなたが単語の一部として句読点をしたいと仮定。
  4. なぜu"'"
  5. u"C'"の一部ではありませんでした。(あなたは単語の一部として句読点をしたいと仮定。

正規表現分割が必要な場合は、nltkを使って行を分割する理由がありますか?私はnltkの経験がないので、ちょうどregex解決策を提案しています。

>>> sentence 
u"d\xe9test\xe9 Rochard ! m'\xe9tais \xe0... 'C'est hyper-cool.' :) :P" 
>>> pattern=re.compile(
    u"(" #Capturing Group 
    "(?:" #Non Capturing 
    "[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]?" #0-1 punctuation 
    "[\w\-]+"       #Alphanumeric Unicode Word with hypen 
    "[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]?" #0-1 punctuation 
    ")" 
    "|(?:[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]+)" #1- punctuation 
    ")",re.UNICODE) 
>>> pattern.findall(sentence) 
[u'd\xe9test\xe9', u'Rochard', u'!', u"m'", u'\xe9tais', u'\xe0.', u'..', u"'C'", u'est', u'hyper-cool.', u"'", u':)', u':P'] 

これはあなた

のために働く場合は、findAllのキャプチャグループ、非キャプチャグループ、文字クラス、Unicodeのマッチとのより多くの情報が必要な場合、私はあなたがreパッケージにチラッと見を取ることをお勧め参照してください。 Pythonの また、このシナリオでは、複数の行の文字列を継続す​​る方法が適切かどうかはわかりません。複数行の文字列ではなく、文字列を分割する方法について詳しくは、thisを参照してください。

関連する問題