使用正则表达式将文本拆分为句子

时间:2016-04-13 09:34:57

标签: python regex

我正在学习正则表达式并试图将文本拆分成句子。

这是我的文字

"先生。史密斯以150万美元的价格买下了cheapsite.com,即他为此付出了很多。他介意吗? Adam Jones Jr.认为他没有。在任何情况下,这都不是真的......好吧,概率为.9,它不是。"

我的正则表达式和代码

result = re.match(r"(.*\.{1}\s{1})[A-Z].*",line)

result.group(1)给了我

"先生。史密斯以150万美元的价格买下了cheapsite.com,即他为此付出了很多。他介意吗? Adam Jones Jr.认为他没有。无论如何,这不是真的......"

我希望它能给我一个句子,直到第一次出现"。#34;。 我知道这是一场贪婪的比赛,但无法弄清楚如何实现这一目标以及寻求帮助。

注意:我发现许多正则表达式在线将文本分成句子,但我想自己做。感谢!!!

1 个答案:

答案 0 :(得分:1)

使用以下RegEx:

.*?\.(?= [A-Z]|$)

.*?会选择可选数据,但它是懒惰的(它会选择第一个.

(?=)肯定前瞻。它将检查数据是否存在,但不会捕获它,因此您不会得到My first sentence. M,就像下面的RegEx一样。它将检查空格后跟大写字母([A-Z])或(|)字符串结尾($

Live Demo on Regex101

最安全的正则表达式(处理Mr.Mrs.

要阻止Mr.弄乱RegEx,您可以向RegEx添加负面反对

.*?(?<!Mr|Mrs)\.(?= [A-Z]|$)

Negative Lookbehind将向后看以检查点之前是否有MrMrs。如果有,则匹配将失败(这不会是句子的结尾)。

Live Demo on Regex101

您可以使用.*?\. [A-Z],但这不会捕获字符串中的最后一句话。它还将匹配句子后面的空格和字母,即My first sentence. M

你的RegEx的主要问题是第一个.*不是懒惰的,应该是.*?,但捕获组也有点奇怪。