我正在尝试找到一个正则表达式,它会将一段文本拆分为句子.
/ ?
/ !
,然后是一个空格,后跟一个首都信。
"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]/")
答案 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