提取字符串中的第一句话

Posted

技术标签:

【中文标题】提取字符串中的第一句话【英文标题】:Extract first sentence in string 【发布时间】:2018-07-30 19:00:35 【问题描述】:

我想从下面的正则表达式中提取第一句话。我要实施的规则(我知道这不是通用解决方案)是从字符串开始 ^ 中提取直到(包括)第一个以小写字母开头的句点/感叹号/问号或号码

require(stringr)

x = "Bali bombings: U.S. President George W. Bush amongst many others has condemned the perpetrators of the Bali car bombing of October 11. The death toll has now risen to at least 187."

到目前为止,我最好的猜测是尝试实现非贪婪的 string-before-match approach 在这种情况下失败:

str_extract(x, '.+?(?=[a-z0-9][.?!] )')
[1] NA

非常感谢任何提示。

【问题讨论】:

试试sub("([a-z0-9][?!.]).*", "\\1", x) 感谢维克托。这当然适用于这个例子。为什么October 11. 的最后一个1 不匹配? 不确定你的意思,你只需要检查一个数字或小写字母,对吧? 对不起,我看到你调整了你的建议。现在看看 【参考方案1】:

您将[a-z0-9][.?!] 放入一个非消耗的前瞻模式中,如果您打算使用str_extract,则需要使其消耗:

> str_extract(x, '.*?[a-z0-9][.?!](?= )')
[1] "Bali bombings: U.S. President George W. Bush amongst many others has condemned the perpetrators of the Bali car bombing of October 11."

见this regex demo。

详情

.*? - 除换行符以外的任何 0+ 个字符 [a-z0-9] - ASCII 小写字母或数字 [.?!] - .?! (?= ) - 后跟一个文字空格。

或者,您可以使用sub:

sub("([a-z0-9][?!.])\\s.*", "\\1", x)

见this regex demo。

详情

([a-z0-9][?!.]) - 第 1 组(用替换模式中的 \1 表示):一个 ASCII 小写字母或数字,然后是 ?!. \s - 一个空格 .* - 任何 0+ 个字符,尽可能多(直到字符串末尾)。

【讨论】:

不适用于第一句中带有 Mr.Dr.句子 - 例如。 Mr. Mahendra Prasad, a politician from Janata Dal (United) party, is a Member of the Parliament of India representing Bihar in the Rajya Sabha, the upper house of the Parliament . Second sentence etc. 我认为它应该处理标题不匹配句尾 - en.wikipedia.org/wiki/Title @jaggi 为什么要在我的解决方案中添加2?它不符合当前的 OP 要求。请参阅我要实施的规则(我知道这不是通用解决方案)是从字符串开始^ 直到(包括)第一个句号/感叹号/问号前面是一个小写字母或数字。上面的句子不是 OP 试图匹配的句子,所以,你的问题是不同的。 啊,我明白了。我不想为此打开一个新问题,所以如果有人需要处理像我这样的 2 个字符标题以获得valid 第一句 - ([a-z0-9]2[?!.])\s.* 【参考方案2】:

corpus在确定句子边界时对缩写有特殊处理:

library(corpus)       
text_split(x, "sentences")
#>   parent index text                                                                                                                           
#> 1 1          1 Bali bombings: U.S. President George W. Bush amongst many others #> has condemned the perpetrators of the Bali car bombing of Oct…
#> 2 1          2 The death toll has now risen to at least 187.  

还有一些有用的数据集,其中包含许多语言(包括英语)的常用缩写。参见corpus::abbreviations_en,可用于消除句子边界的歧义。

【讨论】:

非常有用。我一直在破解可怕的正则表达式来处理 Dr. @dmi3kno 有没有 python 等价物?

以上是关于提取字符串中的第一句话的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从句子中的方括号中提取剩余的子字符串

js中的数字

答果子问R语言如何用正则表达式提取特定的字符串

2015 省赛 聊天止于呵呵

如何用Python将一句话中一个单词前后的两个单词提取出来

一句话实现字段拆分成多行