如何检测两字符串是否存在共同单词?Python实现问询
检测两个字符串的共同单词匹配
嘿,这个需求其实挺常见的,我给你整理几个实用的Python实现方案,按需选就行:
基础实现(快速直观)
最直接的思路是把两个字符串拆成单词集合,然后检查它们的交集是否非空——集合的交集操作效率很高,非常适合这种场景。
注意:这里转成小写是为了避免大小写差异导致的匹配失败,比如"Basketball"和"basketball"会被视为同一个单词,如果你的需求是严格区分大小写,去掉.lower()即可
代码示例:
def has_common_word(str1, str2): # 拆分字符串为单词集合,同时转小写统一格式 words1 = set(str1.lower().split()) words2 = set(str2.lower().split()) # 检查交集是否不为空,空集合转布尔值是False,非空则为True return bool(words1 & words2) # 测试你的示例 str_a = "I am playing basketball everyday" str_b = "basketball is the worst game ever" print(has_common_word(str_a, str_b)) # 输出: True
处理标点符号的优化版
上面的基础版有个小问题:如果单词后面跟着标点(比如"basketball,"),split()会把它当成和"basketball"完全不同的单词。如果要处理这种场景,我们可以先移除字符串里的标点符号再拆分:
import string def has_common_word_with_punctuation_handling(str1, str2): # 创建标点符号移除器 translator = str.maketrans('', '', string.punctuation) # 移除标点、转小写、拆分单词 words1 = set(str1.lower().translate(translator).split()) words2 = set(str2.lower().translate(translator).split()) return bool(words1 & words2) # 测试带标点的场景 str_c = "I love basketball, it's my favorite sport!" str_d = "basketball is such a boring game" print(has_common_word_with_punctuation_handling(str_c, str_d)) # 输出: True
内存友好版(适合大文本)
如果你要处理非常大的字符串(比如长篇文档、日志文件),用集合可能会占用较多内存。这时候可以用“提前存第一个字符串的单词集合,遍历第二个字符串的单词时逐个检查”的方式,一旦找到匹配就立即返回,不用处理完整个字符串:
import string def has_common_word_memory_friendly(str1, str2): translator = str.maketrans('', '', string.punctuation) # 先处理第一个字符串,生成去重的单词集合(集合的查询速度是O(1)) words1 = set(str1.lower().translate(translator).split()) # 遍历第二个字符串的每个单词,找到匹配就立刻返回True for word in str2.lower().translate(translator).split(): if word in words1: return True # 遍历完没找到匹配,返回False return False
这个版本在大文本场景下会更快更省内存,因为不需要把两个大字符串的所有单词都加载到内存里。
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

