2016-10-17 8 views
4

私は文章であるテキストをいくつか持っていますが、そのうちのいくつかは質問です。私は特定のフレーズ、つまり「NSF」を含む質問のみを抽出します正規表現を作成しようとしています:理想的python reを使って文章を含む文章を見つける方法は?

import re 
s = "This is a string. Is this a question? This isn't a question about NSF. Is this one about NSF? This one is a question about NSF but is it longer?" 

を、re.findallを返します:

['Is this one about NSF?','This one is a question about NSF but is it longer?'] 

が、私の現在の最良の試みは、次のとおりです。

re.findall('([\.\?].*?NSF.*\?)+?',s) 
[". Is this a question? This isn't a question about NSF. Is this one about NSF? This one is a question about NSF but is it longer?"] 

私は非貪欲ネスで何かをする必要がありますが、私はめちゃくちゃよどこか分からない知っています。

+1

\([^。?] * NSF [^。?] *??[?])S * 'r 'を試してみてください'' –

+0

@WiktorStribiżewありがとう!自分の理解を助けるためにあなたが少しした変更を説明できますか? – zephyr1999

+0

私は子供たちを寝たきりにしていました。それで、それはあなたのために働くのですか?要点は、ネガティブ文字クラスを使用して、特定の文字以外のテキストチャンクにマッチさせることです。 –

答えて

1

DISCLAIMER:答えは、総称的な質問文分割ソリューションを目指すのではなく、OPによって提供された文字列が正規表現とどのように一致するかを示します。最良の解決策は、テキストをnltkで文章にトークン化し、文章を解析することです(this thread参照)。

あなたが投稿したような文字列に使用したい正規表現は、最後の句読点ではないすべての文字をマッチングし、次にその中に表示したいサブリングをマッチングし、もう一度句読点。 1文字を無効にするには、無効な文字クラスを使用します。

\s*([^!.?]*?NSF[^!.?]*?[?]) 

regex demoを参照してください。

詳細

  • \s* - 0+空白
  • ([^!.?]*?NSF[^.?]*?[?]) -
    • [^!.?]*?をキャプチャグループ1 - 0+
    • できるだけ少ないよう .!?以外の文字、
    • NSF - 値あなたが存在する必要があります、文字のシーケンスNSF
    • [^.?]*? - ibid。
    • [?] - リテラル?\?に置き換えることができます)
関連する問題