跳转到主要内容

文本字符串的快速多关键词搜索引擎

项目描述

什么是Acora?

Acora是Python版的'fgrep',一个快速多关键词文本搜索引擎。

基于一组关键词和Aho-Corasick算法,它生成一个搜索自动机,并在字符串输入上运行,可以是Unicode或字节。

Acora附带纯Python实现和用Cython编写的快速二进制模块。然而,请注意,当前的构造算法不适合非常大的关键词集合(即超过几千个)。

您可以在github上找到最新源代码

要报告错误或请求新功能,请使用github错误跟踪器。请尝试提供一个简短的测试用例,以在没有太多实验或大量数据的情况下重现问题。问题越容易重现,就越容易解决。

功能

  • 支持Unicode字符串和字节字符串

  • 对于大多数输入,速度大约是Python正则表达式引擎的2-3倍

  • 找到重叠的匹配项,即所有关键词的所有匹配项

  • 支持不区分大小写的搜索(比're'快约10倍)

  • 搜索时释放GIL

  • 额外的(慢但简短)纯Python实现

  • 支持Python 2.5+和3.x

  • 支持在文件中搜索

  • 宽松的BSD许可

如何使用它?

导入包

>>> from acora import AcoraBuilder

收集一些关键词

>>> builder = AcoraBuilder('ab', 'bc', 'de')
>>> builder.add('a', 'b')

或者

>>> builder.update(['a', 'b'])  # new in version 2.0

为当前关键词集生成Acora搜索引擎

>>> ac = builder.build()

搜索字符串的所有出现

>>> ac.findall('abc')
[('a', 0), ('ab', 0), ('b', 1), ('bc', 1)]
>>> ac.findall('abde')
[('a', 0), ('ab', 0), ('b', 1), ('de', 2)]

迭代搜索结果

>>> for kw, pos in ac.finditer('abde'):
...     print("%2s[%d]" % (kw, pos))
 a[0]
ab[0]
 b[1]
de[2]

Acora还直接支持解析文件(二进制模式)

>>> keywords = ['Import', 'FAQ', 'Acora', 'NotHere'.upper()]

>>> builder = AcoraBuilder([s.encode('ascii') for s in keywords])
>>> ac = builder.build()

>>> found = set(kw for kw, pos in ac.filefind('README.rst'))
>>> len(found)
3

>>> sorted(str(s.decode('ascii')) for s in found)
['Acora', 'FAQ', 'Import']

常见问题解答和食谱

  1. 如何进行最长匹配关键词的贪婪搜索?

    >>> builder = AcoraBuilder('a', 'ab', 'abc')
    >>> ac = builder.build()
    
    >>> for kw, pos in ac.finditer('abbabc'):
    ...     print(kw)
    a
    ab
    a
    ab
    abc
    
    >>> from itertools import groupby
    >>> from operator import itemgetter
    
    >>> def longest_match(matches):
    ...     for pos, match_set in groupby(matches, itemgetter(1)):
    ...         yield max(match_set)
    
    >>> for kw, pos in longest_match(ac.finditer('abbabc')):
    ...     print(kw)
    ab
    abc

    请注意,此配方假设搜索词除了它们的词首之外没有内部重叠。

  2. 如何按行解析具有任意行结束符的文件?

    >>> def group_by_lines(s, *keywords):
    ...     builder = AcoraBuilder('\r', '\n', *keywords)
    ...     ac = builder.build()
    ...
    ...     current_line_matches = []
    ...     last_ending = None
    ...
    ...     for kw, pos in ac.finditer(s):
    ...         if kw in '\r\n':
    ...             if last_ending == '\r' and kw == '\n':
    ...                 continue # combined CRLF
    ...             yield tuple(current_line_matches)
    ...             del current_line_matches[:]
    ...             last_ending = kw
    ...         else:
    ...             last_ending = None
    ...             current_line_matches.append(kw)
    ...     yield tuple(current_line_matches)
    
    >>> kwds = ['ab', 'bc', 'de']
    >>> for matches in group_by_lines('a\r\r\nbc\r\ndede\n\nab', *kwds):
    ...     print(matches)
    ()
    ()
    ('bc',)
    ('de', 'de')
    ()
    ('ab',)
  3. 如何找到包含关键词的整行,就像fgrep一样?

    >>> def match_lines(s, *keywords):
    ...     builder = AcoraBuilder('\r', '\n', *keywords)
    ...     ac = builder.build()
    ...
    ...     line_start = 0
    ...     matches = False
    ...     for kw, pos in ac.finditer(s):
    ...         if kw in '\r\n':
    ...             if matches:
    ...                  yield s[line_start:pos]
    ...                  matches = False
    ...             line_start = pos + 1
    ...         else:
    ...             matches = True
    ...     if matches:
    ...         yield s[line_start:]
    
    >>> kwds = ['x', 'de', '\nstart']
    >>> text = 'a line with\r\r\nsome text\r\ndede\n\nab\n start 1\nstart\n'
    >>> for line in match_lines(text, *kwds):
    ...     print(line)
    some text
    dede
    start

变更日志

  • 2.5 [2024-09-14]

    • 通过使用Cython 3.0.11构建来更新以支持CPython 3.13。

  • 2.4 [2023-09-17]

    • 通过使用Cython 3.0.2构建来更新以支持CPython 3.12。

  • 2.3 [2021-03-27]

    • 通过使用Cython 0.29.22构建来更新以支持CPython 3.9。

  • 2.2 [2018-08-16]

    • 通过使用Cython 0.29构建来更新以支持CPython 3.7。

  • 2.1 [2017-12-15]

    • 修复处理空引擎的问题(GitHub问题#18)

  • 2.0 [2016-03-17]

    • 重构构造算法以提高速度并节省内存

  • 1.9 [2015-10-10]

    • 使用Cython 0.23.4重新编译,以更好地兼容最新的Python版本。

  • 1.8 [2014-02-12]

    • 对预构建搜索引擎提供pickle支持

    • 在构建器中进行性能优化

    • Unicode解析针对Python 3.3及以后版本进行优化

    • 当安装Cython时不再重新编译源代码,除非在setup.py中传递--with-cython选项(需要Cython 0.20+)

    • 使用最近的Cython版本构建时失败

    • 使用Cython 0.20.1构建

  • 1.7 [2011-08-24]

    • 搜索二进制字符串中字节值>127时出错

    • 使用Cython 0.15+构建

  • 1.6 [2011-07-24]

    • 自动机构建显著更快

    • 不再将.hg仓库包含在源分发中

    • 使用Cython 0.15(rc0)构建

  • 1.5 [2011-01-24]

    • Cython编译的NFA-2-DFA构造运行速度显著提高

    • 即使没有安装Cython,也始终构建扩展模块

    • setup.py中使用--no-compile选项来防止构建扩展模块

    • 使用Cython 0.14.1(rc2)构建

  • 1.4 [2009-02-10]

    • 内部搜索引擎循环中的小幅度加速

    • 一些代码清理

    • 使用Cython 0.12.1(最终版本)构建

  • 1.3 [2009-01-30]

    • 针对文件搜索的主要修复

    • 使用Cython 0.12.1(beta0)构建

  • 1.2 [2009-01-30]

    • AcoraBuilder类的深度复制支持

    • doc/test修复

    • 在源分发中包含.hg仓库

    • 使用Cython 0.12.1(beta0)构建

  • 1.1 [2009-01-29]

    • 文档更新

    • 一些清理

    • 使用Cython 0.12.1(beta0)构建

  • 1.0 [2009-01-29]

    • 初始发布

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

acora-2.5.tar.gz (268.9 kB 查看散列)

构建分发

acora-2.5-cp313-cp313-win_amd64.whl (134.4 kB 查看散列)

上传于 CPython 3.13 Windows x86-64

acora-2.5-cp313-cp313-musllinux_1_1_x86_64.whl (184.2 kB 查看哈希值)

上传于 CPython 3.13 musllinux: musl 1.1+ x86-64

acora-2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (181.5 kB 查看哈希值)

上传于 CPython 3.13 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

acora-2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (168.7 kB 查看哈希值)

上传于 CPython 3.13 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

acora-2.5-cp313-cp313-macosx_12_0_universal2.whl (299.2 kB 查看哈希值)

上传于 CPython 3.13 macOS 12.0+ universal2 (ARM64, x86-64)

acora-2.5-cp312-cp312-win_amd64.whl (135.5 kB 查看哈希值)

上传于 CPython 3.12 Windows x86-64

acora-2.5-cp312-cp312-musllinux_1_1_x86_64.whl (186.8 kB 查看哈希值)

上传于 CPython 3.12 musllinux: musl 1.1+ x86-64

acora-2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (182.7 kB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

acora-2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (169.7 kB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

acora-2.5-cp312-cp312-macosx_12_0_universal2.whl (300.3 kB 查看哈希值)

上传于 CPython 3.12 macOS 12.0+ universal2 (ARM64, x86-64)

acora-2.5-cp311-cp311-win_amd64.whl (135.1 kB 查看哈希值)

上传于 CPython 3.11 Windows x86-64

acora-2.5-cp311-cp311-musllinux_1_1_x86_64.whl (193.5 kB 查看哈希值)

上传于 CPython 3.11 musllinux: musl 1.1+ x86-64

acora-2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (190.3 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

acora-2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (178.2 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.24+ x86-64

acora-2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (156.8 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

acora-2.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (179.2 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

acora-2.5-cp311-cp311-macosx_12_0_universal2.whl (298.1 kB 查看哈希值)

上传于 CPython 3.11 macOS 12.0+ universal2 (ARM64, x86-64)

acora-2.5-cp310-cp310-win_amd64.whl (134.6 kB 查看哈希值)

上传于 CPython 3.10 Windows x86-64

acora-2.5-cp310-cp310-musllinux_1_1_x86_64.whl (193.3 kB 查看哈希值)

上传于 CPython 3.10 musllinux: musl 1.1+ x86-64

acora-2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (190.8 kB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

acora-2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (178.0 kB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.24+ x86-64

acora-2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (157.8 kB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

acora-2.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (180.7 kB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

acora-2.5-cp310-cp310-macosx_12_0_x86_64.whl (157.7 kB 查看哈希值)

上传于 CPython 3.10 macOS 12.0+ x86-64

acora-2.5-cp39-cp39-win_amd64.whl (134.9 kB 查看哈希值)

上传于 CPython 3.9 Windows x86-64

acora-2.5-cp39-cp39-musllinux_1_1_x86_64.whl (194.0 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ x86-64

acora-2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (190.9 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

acora-2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (178.6 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.24+ x86-64

acora-2.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (158.1 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

acora-2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (182.9 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.5+ x86-64

acora-2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl (172.1 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.5+ i686

acora-2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (181.6 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

acora-2.5-cp39-cp39-macosx_12_0_x86_64.whl (158.2 kB 查看哈希值)

上传时间: CPython 3.9 macOS 12.0+ x86-64

acora-2.5-cp38-cp38-win_amd64.whl (135.2 kB 查看哈希值)

上传时间: CPython 3.8 Windows x86-64

acora-2.5-cp38-cp38-musllinux_1_1_x86_64.whl (195.6 kB 查看哈希值)

上传时间: CPython 3.8 musllinux: musl 1.1+ x86-64

acora-2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (193.1 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

acora-2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (179.5 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.24+ x86-64

acora-2.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (159.2 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

acora-2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (182.6 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.5+ x86-64

acora-2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl (171.7 kB 查看哈希值)

上传时间 CPython 3.8 manylinux: glibc 2.5+ i686

acora-2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (181.7 kB 查看哈希值)

上传时间 CPython 3.8 manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

acora-2.5-cp38-cp38-macosx_12_0_x86_64.whl (157.6 kB 查看哈希值)

上传时间 CPython 3.8 macOS 12.0+ x86-64

acora-2.5-cp37-cp37m-win_amd64.whl (133.7 kB 查看哈希值)

上传时间 CPython 3.7m Windows x86-64

acora-2.5-cp37-cp37m-musllinux_1_1_x86_64.whl (191.6 kB 查看哈希值)

上传时间 CPython 3.7m musllinux: musl 1.1+ x86-64

acora-2.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (192.6 kB 查看哈希值)

上传时间 CPython 3.7m manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

acora-2.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (180.0 kB 查看哈希值)

上传时间 CPython 3.7m manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.24+ x86-64

acora-2.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl (160.0 kB 查看哈希值)

上传时间 CPython 3.7m manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.24+ ARM64

acora-2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (190.8 kB 查看哈希值)

上传时间 CPython 3.7m manylinux: glibc 2.5+ x86-64

acora-2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl (177.4 kB 查看哈希值)

上传于 CPython 3.7m manylinux: glibc 2.5+ i686

acora-2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (184.3 kB 查看哈希值)

上传于 CPython 3.7m manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

acora-2.5-cp37-cp37m-macosx_12_0_x86_64.whl (156.0 kB 查看哈希值)

上传于 CPython 3.7m macOS 12.0+ x86-64

acora-2.5-cp36-cp36m-win_amd64.whl (150.1 kB 查看哈希值)

上传于 CPython 3.6m Windows x86-64

acora-2.5-cp36-cp36m-musllinux_1_1_x86_64.whl (185.6 kB 查看哈希值)

上传于 CPython 3.6m musllinux: musl 1.1+ x86-64

acora-2.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (183.8 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.28+ x86-64

acora-2.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (174.4 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.24+ x86-64

acora-2.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (183.0 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.5+ x86-64

acora-2.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl (171.5 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.5+ i686

acora-2.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_24_i686.whl (178.2 kB 查看哈希值)

上传于 CPython 3.6m manylinux: glibc 2.24+ i686 manylinux: glibc 2.5+ i686

acora-2.5-cp36-cp36m-macosx_12_0_x86_64.whl (152.7 kB 查看哈希值)

上传时间: CPython 3.6m macOS 12.0+ x86-64

acora-2.5-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (179.9 kB 查看哈希值)

上传时间: CPython 3.5m manylinux: glibc 2.5+ x86-64

acora-2.5-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl (169.2 kB 查看哈希值)

上传时间: CPython 3.5m manylinux: glibc 2.5+ i686

acora-2.5-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl (176.4 kB 查看哈希值)

上传时间: CPython 2.7mu manylinux: glibc 2.5+ x86-64

acora-2.5-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl (160.5 kB 查看哈希值)

上传时间: CPython 2.7mu manylinux: glibc 2.5+ i686

acora-2.5-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (178.9 kB 查看哈希值)

上传时间: CPython 2.7m manylinux: glibc 2.5+ x86-64

acora-2.5-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl (162.7 kB 查看哈希值)

上传时间: CPython 2.7m manylinux: glibc 2.5+ i686

支持