Python中实现含例外规则的句子分割:跳过Mt.后的句点
正确分割包含缩写的英文句子的Python方案
嗨,这个问题我太熟了!直接用split(".")确实会踩坑——它会把所有句号都当作句子分割点,就连Mt.这种缩写里的句号也被拆分,导致得到错误的结果。给你两个靠谱的解决方案:
方案一:纯正则表达式(无需第三方库)
我们可以用正则的负向回顾断言来区分“缩写里的句号”和“句子结尾的句号”:只分割那些前面不是短单词(比如1-2个字母的缩写,像Mt、Mr、Ms这类)的句号,并且确保句号后面是空格加大写字母(句子开头的特征),或者句号在字符串末尾。
代码示例:
import re data = "Mt. Everest is the highest peak in the world. It's height is 8848 m." # 正则规则:匹配符合句子结尾特征的句号,排除缩写里的句号 sentences = re.split(r'(?<!\b[A-Za-z]{1,2})\. (?=[A-Z])|\.$', data) # 过滤掉分割后产生的空字符串,同时去除多余空格 sentences = [sent.strip() for sent in sentences if sent.strip()] print(sentences) # 输出:["Mt. Everest is the highest peak in the world", "It's height is 8848 m"]
方案二:用NLTK专业分词工具(更健壮)
如果需要处理更多复杂场景(比如更多类型的缩写、特殊句式),可以用NLTK库的sent_tokenize——它是专门训练过的句子分割工具,能自动识别缩写,不会误拆分。
首先需要安装NLTK并下载必要的模型:
# 安装NLTK(如果没装过) # pip install nltk import nltk nltk.download('punkt') # 下载分词模型
然后使用工具分割句子:
from nltk.tokenize import sent_tokenize data = "Mt. Everest is the highest peak in the world. It's height is 8848 m." sentences = sent_tokenize(data) print(sentences) # 输出:["Mt. Everest is the highest peak in the world.", "It's height is 8848 m."]
这两种方法都能完美解决你的问题,纯正则适合不想引入第三方库的场景,NLTK则更适合处理复杂文本~
内容的提问来源于stack exchange,提问作者Subigya Upadhyay
相关产品推荐
相关产品推荐

