在文本处理场景中(如敏感词过滤、同义词替换、日志脱敏),常常需要批量替换多个关键词。如果用普通方法(如循环调用 str.replace),每次匹配都要遍历全文,效率极低(时间复杂度接近 O(n×m),n 是文本长度,m 是关键词数量)。
百科定义
AC 自动机(Aho-Corasick Automaton)是一种高效的多模式匹配算法,能在 O(n + m + z) 的时间复杂度内完成所有模式的匹配(n 是文本长度,m 是总关键词长度,z 是匹配结果数),非常适合批量替换场景。
以下基于 ahocorasick 库实现的代码,核心是用 AC 自动机批量替换文本中的关键词,步骤如下:
ahocorasick 是 Python 中实现 AC 自动机的高效库
# pip install pyahocorasick
import ahocorasick
A = ahocorasick.Automaton()
# 逻辑:遍历字典 `keywords`,将每个关键词 `key` 加入自动机,并携带 `(idx, key)` 作为 “有效负载”(后续匹配时可直接获取关键词,用于替换)。
keywords = {"每天": "每一天", "开开心心": "忙忙碌碌"}
for idx, key inenumerate(keywords):
A.add_word(key, (idx, key)) # 存储 (索引, 关键词) 作为有效负载
# 这一步是 AC 自动机的核心,让后续匹配时能快速跳转,避免重复匹配。
A.make_automaton()
def batch_replace(text, A):
result = ""
last_end_index = 0# 记录上一个匹配的结束位置
for end_index, original_value in A.iter(text):
# original_value 是 add_word 时传入的 (idx, key)
key = original_value[1] # 提取关键词
start_index = end_index - len(key) + 1# 计算匹配的起始位置
# 拼接非匹配部分
result += text[last_end_index:start_index]
# 拼接替换后的值
result += keywords[key]
last_end_index = end_index + 1# 更新结束位置
# 拼接剩余未匹配的文本
result += text[last_end_index:]
return result
text = "每天都要开开心心上班哦"
new_text = batch_replace(text, A)
print(new_text)
A.iter(text) 会按顺序返回每个匹配的结束索引和有效负载)。
***)。今天 和 今天早上),AC 自动机默认匹配最长前缀,需根据业务调整匹配策略。key.lower() 和 text.lower())。timeit 监控匹配时间,或优化关键词存储(如去重、排序)。总结:AC 自动机是处理多模式匹配的 “神器”,结合 ahocorasick 库能高效实现批量文本替换,大幅提升处理性能。
#Python #Python替换