当前位置: 代码网 > it编程>前端脚本>Python > Python 多模式字符串搜索 Aho-Corasick详解

Python 多模式字符串搜索 Aho-Corasick详解

2025年01月20日 Python 我要评论
ahocorasick.automaton 是 python 中 pyahocorasick 库提供的一个类,用于实现 aho-corasick 自动机。aho-corasick 算法是一种用于精确或

ahocorasick.automaton 是 python 中 pyahocorasick 库提供的一个类,用于实现 aho-corasick 自动机。aho-corasick 算法是一种用于精确或近似多模式字符串搜索的高效算法。

通过 pip install pyahocorasick 安装 pyahocorasick 库。
并且,该模块是用 c 编写的,安装时需要有 c 编译器来编译本机 cpython 扩展。

使用 ahocorasick.automaton 类的一般步骤如下:

  • 导入 ahocorasick 库:import ahocorasick
  • 创建 automaton 对象:a = ahocorasick.automaton()
  • (可选)将字符串键及其关联值添加到自动机,可作为 trie 树使用。例如:
for idx, key in enumerate('heherhersshe'.split()):
    a.add_word(key, (idx, key))

调用 make_automaton() 方法完成并创建 aho-corasick 自动机:a.make_automaton()

创建好自动机后,可以使用以下主要方法进行搜索操作:

  • iter(string, (start, (end))):使用提供的输入字符串执行 aho-corasick 搜索过程。它返回一个迭代器,为在字符串中找到的键返回元组 (end_index, value),其中 end_index 是匹配结束的索引位置,value 是与匹配的键相关联的值。
  • iter_long(string, (start, (end))):返回一个搜索最长、非重叠匹配的迭代器(automaton_search_iter_long 类的对象)。

以下是一个使用 ahocorasick.automaton 进行多模式字符串搜索的示例代码:

import ahocorasick as ah
a = ah.automaton()
with open('userdict.txt', 'r', encoding='utf-8') as f2:  # 加载文件
    keywords = (a.strip() for a in f2.readlines())  # 加载关键词
    # 利用 add_word 方法将关键词加入自动机!
    for x in range(len(keywords)):
        a.add_word(keywords[x], (x, keywords[x]))  # 第二个参数为自定义的返回值
# 创建 aho-corasick 自动机
a.make_automaton()
with open('jianjie.txt', 'r', encoding='utf-8') as f:  # 打开要检索文档
    jianjie = f.read()  # 读取正文(如果太多,可以分断加载,分段检索)
# 开始查找,该方法匹配最长的字符串
for item in a.iter_long(jianjie):
    print(item)
print('-' * 20)
# 开始查找,该方法匹配所有字符串
for item in a.iter(jianjie):
    print(item)

在上述示例中,首先创建了一个自动机对象 a,然后从文件中读取关键词,并使用 add_word 方法将关键词添加到自动机中。接着调用 make_automaton 方法创建 aho-corasick 自动机。最后,通过打开另一个文件读取要搜索的正文,并使用 iter_longiter 方法进行匹配查找,并打印出匹配的结果。

aho-corasick 自动机的优点包括能够在一次运行中找到给定集合所有字符串,适用于多模式字符串匹配的场景,例如网络内容过滤、版权检测、病毒扫描等,在自然语言处理中查找特定词汇或模式,以及生物信息学中在 dna 或蛋白质序列分析中寻找特定的序列模式等方面都有应用。

到此这篇关于python 多模式字符串搜索 aho-corasick详解的文章就介绍到这了,更多相关python 多模式字符串搜索内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com