【问题标题】:Split sentence by period followed by a capital letter按句号拆分句子,后跟大写字母
【发布时间】:2022-01-23 13:12:32
【问题描述】:

我正在尝试找到一个正则表达式,它将一段文本拆分为 ./?/! 的句子,然后是一个空格,后跟一个大写字母。

"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]/")

【问题讨论】:

  • 向我们展示您目前使用的正则表达式。
  • 到目前为止你写了什么正则表达式?
  • 请注意,acc。根据您的要求,不应拆分最终的.
  • 您是否要拆分句子?因为在这种情况下,您可能希望保持标点符号 [.?!] 完整。
  • 好吧,如果我们要将真正的段落拆分成真正的句子,我们最好使用一些已经可用的库。

标签: ruby regex string


【解决方案1】:

根据它是 ./?/! 的条件将一段文本拆分为句子后跟一个空格,后跟一个大写字母。

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

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 解决方案/库。见:

后者基于正则表达式,可以很容易地用更多的正则表达式进行扩展。

【讨论】:

    【解决方案2】:

    除了 Wiktor's Answer,您还可以使用环视查找零宽度并在其上分割。

    正则表达式: (?<=[.?!]\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 想要将字符串分成句子,我建议 (?&lt;=[.?!])\s+(?=[A-Z]),因为它会删除句子之间的空格并允许此类空格的数量大于一个

    【讨论】:

    • 我不会在这里使用lookbehind,因为它是固定宽度并且很难控制空白。但是,OP 示例和要求并非 100% 匹配,目前无法提供最佳答案。
    • @WiktorStribiżew:同意。
    • 如果 OP 想要将字符串分成句子,我建议 (?&lt;=[.?!])\s+(?=[A-Z]),因为它会删除句子之间的空格并允许此类空格的数量大于一个。
    • @CarySwoveland:这是合法的。将其添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多