Python 句子提取器中的正则表达式

Regular expression in Python sentence extractor

我有一个脚本可以给我包含指定关键字列表之一的句子。一个句子定义为两个句点之间的任何内容。

现在我想用它来 select 像 'Put 1.5 grams of powder in' 这样的句子的所有部分,如果 powder 是关键词,它会得到整个句子而不是“5 grams of powder”

我想弄清楚如何表达一个句子介于句点序列和 space 之间。我的新过滤器是:

def iterphrases(text):
    return ifilter(None, imap(lambda m: m.group(1), finditer(r'([^\.\s]+)', text)))

但是现在我不再只打印 pieces/phrases 个单词(包括我的关键字)的任何句子。我对自己做错了什么感到很困惑。

如果您不必使用迭代器,re.split 对您的用例(句子的自定义定义)来说会更简单一些:

re.split(r'\.\s', text)

请注意,最后一句话将包含 . 或为空(如果 text 在最后一个句点后以空格结尾),以解决此问题:

re.split(r'\.\s', re.sub(r'\.\s*$', '', text))

也可以在 Python - RegEx for splitting text into sentences (sentence-tokenizing)

的答案中查看更一般的情况

对于完全通用的解决方案,您需要一个适当的 句子分词器 ,例如 nltk.tokenize

nltk.tokenize.sent_tokenize(text)

在这里你把它当作一个迭代器。适用于我的测试用例。它认为一个句子是任何东西(非贪婪的)直到一个句点,然后是 space 或行尾。

import re
sentence = re.compile("\w.*?\.(?= |$)", re.MULTILINE)
def iterphrases(text):
    return (match.group(0) for match in sentence.finditer(text))

如果您确定 . 除了句子分隔符之外没有其他用途,并且每个相关句子都以句号结尾,那么以下内容可能会有用:

matches = re.finditer('([^.]*?(powder|keyword2|keyword3).*?)\.', text)
result = [m.group() for m in matches]