如何仅统计单词内部撇号,排除单词前后的引号型撇号
解决单词内部撇号的精准统计问题
你的核心需求是区分单词内部的撇号(比如shouldn't里的)和作为引号的撇号(比如'should'或句子首尾的'I will...'),只统计前者对吧?之前的代码因为是遍历所有字符、没考虑撇号的位置,所以会把所有撇号都算进去,我们可以通过「先拆分单词,再判断撇号位置」来解决这个问题。
思路拆解
- 先把句子拆成独立单词,聚焦到单个单词的撇号位置;
- 对每个单词,只统计那些既不是第一个字符、也不是最后一个字符的撇号——这就是单词内部的撇号;
- 可选优化:如果单词前后带其他标点(比如
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
相关产品推荐
相关产品推荐

