如何在不删除字符的前提下快速识别带间隔的变形敏感词?
带间隔字符的敏感词匹配优化方案
核心思路:不需要全量预处理移除所有间隔符,仅在匹配阶段跳过非目标字符,只匹配敏感词的字符序列,时间复杂度和普通敏感词匹配接近,不会额外增加过多耗时。
1. 改造DFA/AC自动机匹配逻辑(性能最优,适合大敏感词库场景)
原有匹配逻辑是当前输入字符等于状态机下一个预期字符时才跳转,仅需做小范围改造:
- 提前定义需要忽略的间隔符哈希集合(比如空格、下划线、短横线等你需要过滤的间隔字符,判断时间复杂度O(1))
- 匹配时如果读到的当前字符属于间隔符集合,直接跳过当前字符继续读下一位,不改变当前状态机的匹配状态
- 普通DFA的回退逻辑正常保留即可,不影响原有普通敏感词的匹配效果
示例代码(Python版,可适配任意语言):
# 可自定义需要忽略的间隔符集合 INTERRUPT_CHARS = {' ', '_', '-', '*'} def match_sensitive(text, sensitive_word, interrupt_chars=INTERRUPT_CHARS): s_len = len(sensitive_word) if s_len == 0: return False # 敏感词当前匹配位置指针 match_ptr = 0 for char in text: if match_ptr >= s_len: break if char in interrupt_chars: continue if char == sensitive_word[match_ptr]: match_ptr += 1 else: # 普通DFA回退逻辑可自行扩展 match_ptr = 0 return match_ptr >= s_len # 测试效果 print(match_sensitive("exam ple", "example")) # 输出True print(match_sensitive("exa_mple", "example")) # 输出True
性能说明:整个匹配过程仅遍历文本一次,时间复杂度为O(n)(n为文本长度),和无间隔匹配的耗时几乎一致,远高于先全量删除间隔符再匹配的方案。
2. 动态生成正则匹配规则(实现成本最低,适合小敏感词库场景)
如果敏感词库量级不大,不需要引入复杂的状态机,可直接用正则实现:
- 对每个敏感词动态生成正则规则,在每个敏感字符之间插入间隔符匹配规则,比如敏感词
example生成的正则为e[\s_-]*x[\s_-]*a[\s_-]*m[\s_-]*p[\s_-]*l[\s_-]*e - 可根据需求新增大小写忽略、全角半角适配等规则,实现成本极低
- 缺点是敏感词量级较大时,正则预编译和匹配的性能会弱于DFA方案
内容的提问来源于stack exchange,提问作者Anony Mous
相关产品推荐
相关产品推荐

