如何按句号分割文本而不拆分小数点或人名?
解决人名缩写被误拆分的正则优化方案
- 先补上原正则遗漏的问号(你要按句号、问号、感叹号拆分,原正则没包含
?) - 核心是添加负向零宽断言排除人名缩写的场景:匹配标点前不能是单个大写字母(避免
N.这种名字缩写点被当作句子结束符)
修改后的正则表达式:
str.split(/(?<!\b[A-Z])[\.\?!]+(?!\d)\s*|\n+\s*/)
关键部分解释
(?<!\b[A-Z]):负向后行断言,确保要拆分的标点(.、!、?)前面不是「单词边界+单个大写字母」,直接排除了Frank N. Jackson里的N.这种人名缩写场景(?!\d):保留你原来的负向前瞻断言,排除小数点(比如3.14里的点不会被拆分)[\.\?!]+:统一匹配句子结束的句号、感叹号、问号,支持多个连续标点(比如Hello!!)\s*:匹配标点后的空格,避免拆分结果里带多余空格|\n+\s*:保留按换行拆分的逻辑
测试示例
输入字符串:"Frank N. Jackson is a philosopher. He wrote 'From Metaphysics to Ethics'! What do you think?"
拆分结果:
["Frank N. Jackson is a philosopher", "He wrote 'From Metaphysics to Ethics'", "What do you think", ""]
最后用filter(Boolean)处理掉末尾的空字符串即可。
内容的提问来源于stack exchange,提问作者jolthedev
相关产品推荐
相关产品推荐

