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

如何更高效实现匹配指定字符组合的文本单词提取函数?

优化特定字符组合的单词筛选函数

嘿,我来帮你优化这段代码!你的需求是从输入文本里筛选出包含tion、ex、ph、ost、ist、ast这些字符组合的单词,当前的for循环写法不仅重复度高,还可能把同一个单词多次添加到结果列表里(比如同时包含ex和tion的explanation,会被append两次),我们可以用更简洁高效的方式来实现。

方法一:正则表达式(推荐,适合复杂匹配)

正则表达式天生擅长处理这种多模式匹配的场景,而且能一次性完成所有规则的检查,还能轻松处理单词边界、大小写等细节:

import re

def filter_words(text):
    # 预编译正则模式,用非捕获组定义所有目标字符组合
    # \b 确保匹配完整单词,re.IGNORECASE 忽略大小写(可选)
    pattern = re.compile(r'\b\w*(?:tion|ex|ph|ost|ist|ast)\w*\b', re.IGNORECASE)
    # 提取所有匹配的单词
    matches = pattern.findall(text)
    # 去重后返回列表
    return list(set(matches))

代码说明:

  • re.compile预编译正则表达式,提升多次调用函数时的效率
  • (?:...)是非捕获组,让findall返回完整的匹配单词,而不是只返回匹配的字符片段
  • \b是单词边界,确保我们匹配的是完整单词(不会漏掉prefix里的ex这类情况,符合你的需求)
  • re.IGNORECASE可以匹配大小写不同的版本(比如Tion、EX),不需要的话可以直接去掉
  • 用set去重,确保同一个单词只会出现在结果里一次

方法二:用集合+any()(轻量无依赖)

如果不想引入正则模块,也可以把目标字符组合放到集合里,结合any()函数来简化判断,同时解决重复添加的问题:

def filter_words(text):
    # 把目标字符组合存到集合中,查找效率更高
    target_patterns = {"tion", "ex", "ph", "ost", "ist", "ast"}
    words = text.split()
    # 集合推导式自动去重,只要单词包含任一目标组合就保留
    return list({word for word in words if any(pattern in word for pattern in target_patterns)})

代码说明:

  • 集合target_patterns的成员查找速度比列表快,数据量大时优势更明显
  • any(pattern in word for pattern in target_patterns)会逐个检查单词是否包含任一目标组合,只要有一个满足就返回True
  • 集合推导式{word for ...}自动帮我们去重,最后转成列表返回

对比你原来的代码,这两种方法都解决了重复添加单词的问题,代码更简洁易读,维护起来也更方便——以后要加新的字符组合,只需要修改正则里的模式或者集合里的元素就行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:22:41