2016-10-17 48 views
4

我有一些文本是句子,其中一些是問題。我試圖創建一個正則表達式將僅提取包含特定的詞,即「國家科學基金會」的問題:如何使用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

嘗試'R'\ S *(?[?] [?^] * NSF [?^] *) '' –

+0

@WiktorStribiżew謝謝!你能解釋一下你爲了幫助自己理解而做出的改變嗎? – zephyr1999

+0

我正在給孩子們上牀睡覺。那麼,它對你有用嗎?關鍵是我使用否定字符類來匹配除特定字符以外的文本塊。 –

回答

1

免責聲明:答案不是針對通用疑問句拆分解決方案,而是顯示OP提供的字符串如何與正則表達式匹配。最好的解決方案是將文本標記爲nltk的句子並解析句子(請參閱this thread)。

您可能希望用於類似於您發佈的字符串的正則表達式基於匹配所有不是最終標點符號的字符,然後匹配想要在句子中出現的子字符串,然後匹配除最終字符之外的那些字符標點符號。要否定單個字符,請使用否定字符類。

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

查看regex demo

詳細

  • \s* - 0+空格
  • ([^!.?]*?NSF[^.?]*?[?]) - 第1組捕獲
    • [^!.?]*? - 0+字符比.!?等,儘可能少
    • NSF - 價值e你需要在場,一串字符NSF
    • [^.?]*? - 同上。
    • [?] - 字面?(可以與\?代替)
相關問題