You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅统计单词内部撇号,排除单词前后的引号型撇号

解决单词内部撇号的精准统计问题

你的核心需求是区分单词内部的撇号(比如shouldn't里的)和作为引号的撇号(比如'should'或句子首尾的'I will...'),只统计前者对吧?之前的代码因为是遍历所有字符、没考虑撇号的位置,所以会把所有撇号都算进去,我们可以通过「先拆分单词,再判断撇号位置」来解决这个问题。

思路拆解

  1. 先把句子拆成独立单词,聚焦到单个单词的撇号位置;
  2. 对每个单词,只统计那些既不是第一个字符、也不是最后一个字符的撇号——这就是单词内部的撇号;
  3. 可选优化:如果单词前后带其他标点(比如don't!或'hello'),可以先清理掉首尾标点,避免干扰判断。

代码实现

基础版本(直接处理拆分后的单词)

counts = {"'": 0}  # 初始化撇号的统计计数器

for sentence in split_sentences:
    words = sentence.split()  # 按空格拆分句子为单词
    for word in words:
        # 遍历单词的每个字符,只统计中间位置的撇号
        for idx, char in enumerate(word):
            # 撇号不在开头(idx != 0)也不在结尾(idx != len(word)-1)
            if char == "'" and 0 < idx < len(word) - 1:
                counts["'"] += 1

这个版本能直接处理像"I shouldn't do that"这样的句子:shouldn't里的撇号在中间位置,会被统计1次;而"'I will not do that'"里的撇号在句子首尾的单词('I和that')的首尾位置,不会被统计。

优化版本(清理单词首尾标点)

如果你的文本里单词常带前后标点(比如don't.、'hello'),可以先清理掉单词首尾的标点再判断,避免误判:

import string

counts = {"'": 0}
# 获取所有常见标点,用于清理单词首尾
strip_puncts = string.punctuation

for sentence in split_sentences:
    words = sentence.split()
    for word in words:
        # 去掉单词首尾的所有标点
        cleaned_word = word.strip(strip_puncts)
        # 如果清理后单词为空(比如只剩标点的情况),直接跳过
        if not cleaned_word:
            continue
        # 统计清理后单词内部的撇号
        for idx, char in enumerate(cleaned_word):
            if char == "'" and 0 < idx < len(cleaned_word) - 1:
                counts["'"] += 1

比如"'should'"清理后变成should,里面没有撇号,不会被统计;don't!清理后变成don't,撇号在中间,会被正常统计。

顺便提下你原代码的小问题

原代码里有个逻辑小bug:if word in counts:这里应该是if p in counts:,因为你要统计的是标点p的数量,而word变量在这个循环里没定义哦~

内容的提问来源于stack exchange,提问作者user11094200

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:22:26