正则表达式扩展为句子

时间:2016-07-07 14:51:02

标签: regex regex-lookarounds

我正在尝试从较长的文本段中提取关键字周围的区域。根据以下条件,它们应包括完整的句子:

  • n = 250如果存在关键字,则应包含关键字之前/之后的关键字(关键字可以更接近文本的开头/结尾)
  • 从那里它应该进一步扩展以包括完整的句子(我们假设在这里我们可以用“。?!或”来定义句子边界,“知道它不完全准确)

我已经实现了扩展到最后一个句子的结尾,但是没有在下面的例子中开始第一个,其中维生素是关键字,斜体由正则表达式捕获。但是,它应该从“额外的24小时......”中捕获 显然我没有预先得到相应的组,既不使用懒惰也不使用lookbehind。

((.{0,250}(vitamin)\b.{0,250})(.+?(\.|\!|\?|\:))?)/ig
  

那么,今年你需要额外的一天才能获得税收,或者(最后)清理车库。 (嘿,我们不是想告诉你什么,但你也可以提高效率。)2月29日又回到了今年,因为它是闰年。无论你是喜欢还是厌恶额外的冬日,你可能都在想它为什么会在第一时间发生。每四年在calen dar中额外建立24小时或每天24小时,以确保它与地球围绕太阳的运动保持一致。在一个日历年中有365天,但它实际上需要更长的时间才能完成地球的年度旅程 - 大约365.2421天 - 围绕着给我们光明,生命和维生素 D的恒星。这种差异可能看起来不大交易给我们,但随着时间的推移,它会加起来。 “为了确保与真正的天文年保持一致,有必要定期添加额外的一天来弥补丢失的时间,让日历与天堂同步,”历史记录。 com。   认识到闰年的必要性发生在Julius Caesar的时代。在公元前46年,凯撒获得天文学家Sosigenes的帮助,以更新日历,使其有12个月365天,包括每四年一次的闰年。

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

(([.?!:][^.?!:]*.{250}\bvitamin\b.{250})[^.?!:]*[.?!:])

它的工作原理是在关键字"维生素"之前和之后消费250个字符的文字。从那时起,它会在250个字符的文本之前/之后找到第一个标点点(.?!:)。

这里是sample of it in action

您可以使用额外的括号()来策略性地分组您想要的确切输出。例如,上述答案包括输出中前一句的结束时段。所以你可以使用

(([.?!:]([^.?!:]*.{250}\bvitamin\b.{250})[^.?!:]*[.?!:]))

并使用结果集中的第3组,该结果集没有此结束期。

答案 1 :(得分:0)

我没有看到问题中的规范如何与正则表达式相匹配。它归结为以下逻辑问题:

  • 要匹配尽可能多的字符,但在关键字之前/之后不超过250,.{0,250}需要贪婪,既不能是懒惰.{0,250}?也不能占有.{0,250}+
  • 如果此部分贪婪,您将错过在.{0,250}部分匹配之前开始的关键字的出现次数。

同样的逻辑也适用于我对匹配回到开始之前的理解。

我玩了以下或多或少有意义的正则表达式:

[.?!:]?([^.?!:]*?(.{0,250}\byear\b.{0,250})[^.?!:]*[.?!:]?)错过了第一年'

[.?!:]?([^.?!:]*?(.{0,250}?\byear\b.{0,250})[^.?!:]*[.?!:]?)获得第一个'年份'但是对其他人失败了。

我建议您在函数中编写提取逻辑,使用正则表达式或不使用正则表达式,以实现所需的提取。

例如,您可以找到关键字\bkeyword\b的开头索引和句号(\.[^\d]|[.?!:]$),然后使用此信息提取所需文本的一部分。