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]
我有一个脚本可以给我包含指定关键字列表之一的句子。一个句子定义为两个句点之间的任何内容。
现在我想用它来 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]