按期间分句,后跟大写字母

时间:2017-05-11 19:47:29

标签: ruby regex string

我正在尝试找到一个正则表达式,它会将一段文本拆分为句子. / ? / !,然后是一个空格,后跟一个首都信。

"Hello there, my friend. In other words, i.e. what's up, man."

应拆分为:

Hello there, my friend| In other words, i.e. what's up, man|

我可以将其拆分为. / ? / !,但我没有运气获得空格和大写字母标准。

我想出了什么:

.split("/. \s[A-Z]/")

2 个答案:

答案 0 :(得分:3)

  

根据标准将一段文本拆分成句子./?/!接下来是一个后跟大写字母的空格。

您可以使用基于前瞻的正则表达式:

s = "Hello there, my friend. In other words, i.e. what's up, man."
puts s.split(/[!?.](?=\s+\p{Lu})/)

请参阅Ruby demo。如果您还需要在字符串末尾使用标点符号进行拆分,请使用/[!?.](?=(?:\s+\p{Lu})|\s*\z)/

<强>详情:

  • [!?.] - 匹配!?.即...
  • (?=\s+\p{Lu}) - (一个积极的前瞻)后面跟着1+个空格,后面紧跟着当前位置右边的1个大写字母。

请参阅Rubular demo

注意:如果您需要将常规英文文本拆分为句子,则应考虑使用现有的NLP解决方案/库。参见:

后者基于正则表达式,可以使用更多正则表达式轻松扩展。

答案 1 :(得分:2)

除了Wiktor的答案之外,您还可以使用外观找到零宽度并将其拆分。

正则表达式: (?<=[.?!]\s)(?=[A-Z])找到零宽度,前面有[.?!]和空格,后跟大写字母。

s = "Hello there, my friend. In other words, i.e. what's up, man."
puts s.split(/(?<=[.?!]\s)(?=[A-Z])/)

<强>输出

Hello there, my friend. 
In other words, i.e. what's up, man.

Ruby Demo

更新:基于Cary Swoveland's comment

  

如果OP希望将字符串分解为句子,我建议使用(?<=[.?!])\s+(?=[A-Z]),因为它会删除句子之间的空格并允许此类空格的数量大于1