【问题标题】:Split text into sentences using Regex使用正则表达式将文本拆分为句子
【发布时间】:2016-08-04 07:24:51
【问题描述】:

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

这是我的文字

“Smith 先生以 150 万美元买下了cheapsite.com,也就是说,他为此付出了很多。他介意吗?小亚当·琼斯认为他不介意。无论如何,这不是真的...嗯,0.9 的概率不是。”

还有我的正则表达式和代码

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

result.group(1) 给我

“Smith 先生以 150 万美元买下了cheapsite.com,也就是说,他为此付出了很多。他介意吗?小亚当·琼斯认为他不介意。无论如何,这不是真的...”

我希望它只给我一个句子,直到第一次出现“。”。 我知道这是一场贪婪的比赛,但无法弄清楚如何实现这一目标,因此寻求帮助。

注意:我在网上找到了许多将文本分成句子的正则表达式,但我想自己做。谢谢!!!

【问题讨论】:

  • 为什么不只是.*?\..* 之后的 ? 使它变得懒惰。请注意,您似乎想将其吐到Mr.,`Smith 以 1. 的价格购买了便宜的网站。, com 等。
  • 想自己做 - 那为什么还要问呢?你知道第一个. 是在缩写Mr 之后吗?
  • 我想确保只有一个“。”后跟一个空格,然后是一个大写字符。
  • 在这种情况下,使用.*?\. [A-Z]
  • 等我搞清楚后,我会为 Mr. Dr. Mrs. etc 工作。

标签: python regex


【解决方案1】:

使用以下正则表达式:

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

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

(?=) 是一个正向预测。它将检查数据是否存在,但不会捕获它,因此您不会以My first sentence. M 结尾,就像下面的正则表达式一样。它将检查空格后跟大写字母 ([A-Z]),或 (|) 字符串结尾 ($)

Live Demo on Regex101


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

要阻止 Mr. 弄乱正则表达式,您可以向正则表达式添加 Negative Lookbehind

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

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

Live Demo on Regex101


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

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

【讨论】:

  • 谢谢!你能帮我纠正我的正则表达式以匹配第一次出现吗?
  • 谢谢!!这教会了我很多。
  • @MukundGandlur 嘿。有没有办法也包括“!”和 ”?”在检查?我这样做的尝试惨遭失败,我正在制作的程序需要它。
  • @user9123 是的,特殊字符可以通过使用\ 转义它们来包含在正则表达式中,因此Mr\? 将匹配文本“Mr?
猜你喜欢
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2014-11-02
相关资源
最近更新 更多