如何在Python中实现仅拆分句点分隔的句子而不拆分域名?
解决Python中分割句子但不拆分域名的问题
这问题我之前处理文本的时候也碰到过,用正则表达式就能精准搞定!核心思路是区分句子结束的句点和域名里的句点:句子的句点后面通常紧跟大写字母(英文句子开头惯例)或带空格的大写字母,而域名里的句点前后都是小写字母/数字,且后面不会直接跟大写字母。
具体实现代码
我们可以利用正则的零宽断言来定位句子的分割位置,这样既能分割句子,又不会破坏域名的结构,还能保留句点在句子末尾:
import re def split_sentences(text): # 匹配句点后面紧跟大写字母(或带空格的大写字母)的位置,进行分割 return re.split(r'(?<=\.)(?=\s?[A-Z])', text) # 测试示例 test_text = "Janice is my mother.She is a good mother. I love google.com and shop.tk very much." result = split_sentences(test_text) for idx, sentence in enumerate(result, 1): print(f"句子{idx}: {sentence.strip()}")
代码解释
(?<=\.):正向回顾断言,确保我们分割的位置前面是一个句点;(?=\s?[A-Z]):正向前瞻断言,确保分割位置后面是可选的空格+大写字母,这符合英文句子开头的特征;- 用
re.split分割这个位置,不会去掉原句中的句点,完美保留句子的完整性。
测试结果
运行上面的代码,输出会是:
句子1: Janice is my mother. 句子2: She is a good mother. 句子3: I love google.com and shop.tk very much.
可以看到,google.com和shop.tk完全保留,没有被拆分,而句子被正确分割开了。
额外说明
如果你的文本里有特殊情况(比如包含缩写如Mr.Smith,而你不想把它拆成两个句子),可以稍微调整正则,加入对缩写的判断,但这需要你根据具体的缩写规则来扩展。不过针对你提出的需求,上面的代码已经完全够用啦!
内容的提问来源于stack exchange,提问作者Alin Georgescu




