一次性搜索字符串中的多个子字符串
项目描述
ahocorasick_rs:快速一次性搜索多个子字符串
ahocorasick_rs
允许您使用 Aho-Corasick 算法的变体在给定的字符串(“稻草”)中搜索多个子字符串(“模式”)。
特别是,它被实现为一个 Rust aho-corasick
库的包装器,并提供了一个比 pyahocorasick
库更快的替代方案。
遇到任何问题或有什么疑问? 在GitHub项目上提交问题。
快速入门
ahocorasick_rs
库允许您在“稻草”中搜索多个字符串(“模式”),或者也可以搜索多个字节。例如,让我们安装这个库
$ pip install ahocorasick-rs
搜索字符串
我们可以构建一个 AhoCorasick
对象
>>> import ahocorasick_rs
>>> patterns = ["hello", "world", "fish"]
>>> haystack = "this is my first hello world. hello!"
>>> ac = ahocorasick_rs.AhoCorasick(patterns)
您可以从任何可迭代对象(包括生成器)中构建一个 AhoCorasick
对象,而不仅仅是列表
>>> ac = ahocorasick_rs.AhoCorasick((p.lower() for p in patterns))
AhoCorasick.find_matches_as_indexes()
返回一个元组列表,每个元组是
- 找到的模式在模式列表中的索引。
- 模式在目标字符串中的起始索引。
- 模式在目标字符串中的结束索引。
>>> ac.find_matches_as_indexes(haystack)
[(0, 17, 22), (1, 23, 28), (0, 30, 35)]
>>> patterns[0], patterns[1], patterns[0]
('hello', 'world', 'hello')
>>> haystack[17:22], haystack[23:28], haystack[30:35]
('hello', 'world', 'hello')
find_matches_as_strings()
返回找到的模式列表
>>> ac.find_matches_as_strings(haystack)
['hello', 'world', 'hello']
搜索 bytes
和其他类似对象
您还可以搜索 bytes
、bytearray
、memoryview
以及支持 Python 缓冲区 API 的其他对象。
>>> patterns = [b"hello", b"world"]
>>> ac = ahocorasick_rs.BytesAhoCorasick(patterns)
>>> haystack = b"hello world"
>>> ac.find_matches_as_indexes(b"hello world")
[(0, 0, 5), (1, 6, 11)]
>>> patterns[0], patterns[1]
(b'hello', b'world')
>>> haystack[0:5], haystack[6:11]
(b'hello', b'world')
BytesAhoCorasick
不支持 find_matches_as_strings()
API。
选择匹配算法
匹配类型
在多个模式重叠的情况下,您可以通过三种方式配置匹配,这两种对象都支持。对于更详细的解释,请参阅底层 Rust 库的匹配文档。
假设我们有这个起点
>>> from ahocorasick_rs import AhoCorasick, MatchKind
Standard
(默认)
这返回第一个匹配的模式,从语义上讲。这是默认匹配模式。
>>> ac AhoCorasick(["disco", "disc", "discontent"])
>>> ac.find_matches_as_strings("discontent")
['disc']
>>> ac = AhoCorasick(["b", "abcd"])
>>> ac.find_matches_as_strings("abcdef")
['b']
在这种情况下,disc
将在 disco
或 discontent
之前匹配。
同样,b
将在 abcd
之前匹配,因为它在目标字符串中的结束位置比 abcd
更早。
>>> ac = AhoCorasick(["b", "abcd"])
>>> ac.find_matches_as_strings("abcdef")
['b']
LeftmostFirst
LeftmostFirst
这返回在目标字符串中最先出现的匹配模式,即 给定模式列表 中第一个出现的模式。这意味着模式的顺序是有影响的
>>> ac = AhoCorasick(["disco", "disc"], matchkind=MatchKind.LeftmostFirst)
>>> ac.find_matches_as_strings("discontent")
['disco']
>>> ac = AhoCorasick(["disc", "disco"], matchkind=MatchKind.LeftmostFirst)
['disc']
在这里我们看到 abcd
首先匹配,因为它在列表中先出现
>>> ac = AhoCorasick(["b", "abcd"], matchkind=MatchKind.LeftmostFirst)
>>> ac.find_matches_as_strings("abcdef")
['abcd']
LeftmostLongest
LeftmostLongest
这返回在目标字符串中最先出现的最长的匹配模式
>>> ac = AhoCorasick(["disco", "disc", "discontent"], matchkind=MatchKind.LeftmostLongest)
>>> ac.find_matches_as_strings("discontent")
['discontent']
重叠匹配
您可以得到所有重叠的匹配,而不是只得到其中一个,但前提是您坚持使用默认的匹配类型 MatchKind.Standard
。同样,这也被 AhoCorasick
和 BytesAhoCorasick
支持。
>>> from ahocorasick_rs import AhoCorasick
>>> patterns = ["winter", "onte", "disco", "discontent"]
>>> ac = AhoCorasick(patterns)
>>> ac.find_matches_as_strings("discontent", overlapping=True)
['disco', 'onte', 'discontent']
额外配置:速度和内存使用的权衡
算法实现:构建速度、内存和性能之间的权衡(《AhoCorasick》和《BytesAhoCorasick》)
您可以选择要使用的底层自动机的类型,具有不同的性能权衡。简而言之:如果您想获得最大的匹配速度,并且模式不多,请尝试使用 Implementation.DFA
实现并查看是否有所帮助。
底层 Rust 库支持四种选择,如下所示
None
使用启发式方法选择为给定模式选择“最佳”Aho-Corasick 实现,平衡构建时间、内存使用和匹配速度。这是默认设置。Implementation.NoncontiguousNFA
:非连续 NFA 是构建速度最快的,具有适中的内存使用量,并且通常在执行搜索时速度最慢。Implementation.ContiguousNFA
:连续 NFA 比非连续 NFA 慢一些构建,具有优异的内存使用量,并且通常比 DFA 搜索速度略慢。Implementation.DFA
:DFA 构建速度非常慢,使用大量的内存,但通常搜索速度最快。
>>> from ahocorasick_rs import AhoCorasick, Implementation
>>> ac = AhoCorasick(["disco", "disc"], implementation=Implementation.DFA)
以内存换取速度(《AhoCorasick》仅限)
如果您使用 find_matches_as_strings()
,字符串可以以两种方式构建:从目标字符串中构建,或将模式缓存到对象中。前者需要更多的工作,后者如果模式会被垃圾回收,则会使用更多的内存。您可以通过使用 AhoCorasick()
的 store_patterns
关键字参数来控制此行为。
AhoCorasick(..., store_patterns=None)
:默认设置。使用启发式方法(目前,模式字符串长度总和是否小于 4096 个字符)来决定是否存储模式。AhoCorasick(..., store_patterns=True)
:保留对模式的引用,可能会加快find_matches_as_strings()
的速度,但会使用更多的内存。如果这使用了大量的内存,这可能会由于对 CPU 内存缓存的压力而减慢速度,并且/或者性能提升可能会被算法的搜索时间所抵消。AhoCorasick(..., store_patterns=False)
:不保留模式引用,节省一些内存,但可能会减慢find_matches_as_strings()
的执行速度,尤其是在模式数量较少且搜索的文本内容较小的情况下。
实现细节
- 字符串匹配会释放全局解释器锁(GIL),以实现并发。出于内存安全的原因,字节匹配目前不会释放GIL,除非文本类型是
bytes
。 - 并非所有底层库的功能都公开;如果您需要额外的功能,请提交问题或提交PR。
基准测试
与任何基准测试一样,实际结果会根据您的特定情况而有所不同。如果性能对您的应用程序很重要,请自行测量替代方案!
尽管如此,我观察到ahocorasick_rs
的运行速度比pyahocorasick
快1.5倍到7倍,具体取决于使用的选项。如果您想查看一些比较结果,可以运行包含的基准测试。克隆仓库后,
pip install pytest-benchmark ahocorasick_rs pyahocorasick
pytest benchmarks/
项目详情
ahocorasick_rs-0.22.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 97347038394997298c4a28770aa348791f87ad46e0561ae833526e1c57d6f38f |
|
MD5 | 398d8bfbfc3675452f51087272801bbf |
|
BLAKE2b-256 | 30608424c65c1df0617a30f97abcfc1fd1aeb3547a0b0538cd7b89b54f1a8ea4 |
ahocorasick_rs-0.22.0-cp312-none-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 34ac0454e04e9b22fa28e457b36e601cb25fecca66e8504fc941fe9eb9cc2425 |
|
MD5 | fb784feec46e98af000e5d7e64d6ee11 |
|
BLAKE2b-256 | 2d68c02181cd6eebbc8101f46b07ca17140b45803cf43506d00a8f205b3bf894 |
ahocorasick_rs-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 88a46fc8363389adbfc558474b72525891ffa4a14a5acb312f365f458bb42f62 |
|
MD5 | 3f734d369ff684f36f6a8c65170c2efd |
|
BLAKE2b-256 | 2851c20674220a64b71ef6422a238fc7eaf6f9d47ca723e43427060d2ba1130b |
ahocorasick_rs-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2ec51b606cbc8c6d5140b94ef197821e33637449be67117d90a81465844f56be |
|
MD5 | 9e2717fbbbb318739cf16fc028896b51 |
|
BLAKE2b-256 | 24121efaf23d205d08ab730cec857a17bdf2b4aafbeb4ba4572029a800ef7fe7 |
ahocorasick_rs-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b054e76507905df3d4dffcdf1a93d5b3d414a8eaaa2687cfcd372f4053716bd0 |
|
MD5 | 6e8a7f9510cd0d0c83438303cc651e93 |
|
BLAKE2b-256 | b5d1f2a27b0580188d567d0122978ad43a6db673b5f599acb095e29eabe3c64f |
ahocorasick_rs-0.22.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b54b7fa8a062cdc3eaf7b7e3ee0254c275480dffec12fea3ed6d753c97bcd1b4 |
|
MD5 | 09e6602a6d58325322386f15ea08c119 |
|
BLAKE2b-256 | 31a6e6aa9864d5d7fd896f12511150c52cb6c8d4849bd07a19aa10b1bb5e9334 |
ahocorasick_rs-0.22.0-cp311-none-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d4cfb2807426e336f99f5d70afdf9163da2352c1c6fd42a9401d17ecbcb39b7b |
|
MD5 | 41e22ab528ba7388a40dd7f86ab4697d |
|
BLAKE2b-256 | 037f5faecd4b45438282977cda2f1427839c596c2fef118bcd54b20c25eb2c46 |
ahocorasick_rs-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 12f32abaa416ef6af36894329c8f65405e3416fa9c6b7c6c297fbf1c0be6a121 |
|
MD5 | 5cef1ec290f8f2eef6b9e8d63af749f1 |
|
BLAKE2b-256 | 510751b5918588a1b360251d83b2f70e22325309c83878a1f23bc13603f646d3 |
ahocorasick_rs-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4685c9a5ad3df978c1552b5f2e7495fcb180be7ee885c09b99600a8bce47fadc |
|
MD5 | 235d7312c12a397226e606137f06984d |
|
BLAKE2b-256 | 3d180e4915506e5569b8bd2594281fc57021001a5dc1e659069e1fbfe571d3e8 |
ahocorasick_rs-0.22.0-cp311-cp311-macosx_10_12_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5482be243a2e32a797feadb2fa485ba8638afc0960bbf742e54f9778c05f8a25 |
|
MD5 | 7ddbc303edb488ee18d1f611555ef7e4 |
|
BLAKE2b-256 | 7d023ca1b6399c99cb48f8c7ef04bc258b2e98ad9345972d765c19ed03aa1a21 |
哈希值 用于 ahocorasick_rs-0.22.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ab4476c05407473eb8c94e37fd2e44991127de24d6e99bbeee95eb388a089a3a |
|
MD5 | 5e6ebca090f5a5322f1cdbd6ac75861f |
|
BLAKE2b-256 | 35902564ddbc474a7f726aed9f125586f263727c6e392d95e8c603897f91c7f3 |
哈希值 用于 ahocorasick_rs-0.22.0-cp310-none-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 034d468401d9b9f009452a471fd787a4edafacf2c7da5cd51c3997f461635240 |
|
MD5 | 32d660de867c679a0c0a890ff72c1976 |
|
BLAKE2b-256 | 1094516407c1a58805b29a7a9ddddc7910ff6580e46b52d61be0947689bdfb0d |
哈希值 用于 ahocorasick_rs-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | af7dc46bbbb5154fb5dcafdbebe568ac6df2fd869f24de163b27b1ceafe1011d |
|
MD5 | 1bbc18d93750c9eebad4fda3cf12f862 |
|
BLAKE2b-256 | efae43b65d1f44f25110ebb321c4afcec20f02e3705c1452541181b64d75105b |
哈希值 用于 ahocorasick_rs-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 461b3b1eade75714ec9f6328b9f07a2c11b5e2640cacb727b0341920bfee533e |
|
MD5 | 38621ecb2622f81c74a3c47f2d181421 |
|
BLAKE2b-256 | 52f09c84e9813cb5aff232dd935ba7fe45580a538e312ecc29dfb3815d01aa45 |
哈希值 用于 ahocorasick_rs-0.22.0-cp310-cp310-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5bbcd9d18af6db7f6c4f9d20652108e7d47805335dfd089dae61afbb5ba154af |
|
MD5 | 14cd7a610d1c430f63f4881ee3d1d53f |
|
BLAKE2b-256 | 53fe1ec2d5575eeb40138673e09ac71684f50e1332e2cf8cd2bb65c2f8564d1c |
哈希值 用于 ahocorasick_rs-0.22.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 464e42d716f5e217596d75b947ecc0fa1d0fbc71d3d519fcd8e4b1f88b456b35 |
|
MD5 | c174da792ec6f705d723ca94f7b7b1b8 |
|
BLAKE2b-256 | 4ab63dcda28f8a2747b25c77492c47e8ab9d0fac23b1735bfd868e0694418297 |
哈希值 用于 ahocorasick_rs-0.22.0-cp39-none-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 660ccb5fb49e8d000ce8219cbfdf2ccb73f29656d622c9a6d2a653de31bf2d6d |
|
MD5 | e2b4c81642dafe6fe99e834263180f7c |
|
BLAKE2b-256 | 9a7f4e9936d01d8e755fc413e43c5e93729f5c9b3431631e9f45d8300d51e208 |
哈希值 用于 ahocorasick_rs-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c96d76ec72453656b5676c24b12d580736b81a250db0cb6a4fdf3a124d05f794 |
|
MD5 | 9bb53707ffd3028af92260bba7d04601 |
|
BLAKE2b-256 | 54b87cef153974206c6b1d35f0083ec6e31abc2b2f6a0f63366b2101fd3b15bc |
哈希值 用于 ahocorasick_rs-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7bd0d78553c41b09763dd792db0cc8b1c15927efd84e93db820e116e5fbe01b4 |
|
MD5 | a9c236639629303c4eef9560bbc2598a |
|
BLAKE2b-256 | ef3d2b7ec9df077a4fa8f09f6d891a2db4d227b730e7b34bd8b0b8397c563b80 |
哈希值 用于 ahocorasick_rs-0.22.0-cp39-cp39-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d4beded7a2b729ad2f6f43ebb7894b44a8a963e4109ce72f790fc17df478eb4c |
|
MD5 | e10589c679ea281acdd6286763335b05 |
|
BLAKE2b-256 | 93a7b5cc8d3f3f53987c2dbcee9d124d519ab54e074fb2fa7b25c9f8b04f7f4e |
哈希值 用于 ahocorasick_rs-0.22.0-cp39-cp39-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | daef82a16465fc345e6c159a562b5aa73c14940e51e68bd9825a42ba5a19acec |
|
MD5 | a9ea8abf911bd55e4921fa8d5ae183aa |
|
BLAKE2b-256 | cf865a328ed7c14be70ee6eb8879d894785841aac6fbf48264a6ced4d13754f7 |
哈希值 用于 ahocorasick_rs-0.22.0-cp38-none-win_amd64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fd28a5a8821a1adc820d0192b32a1d9385157d9708d8fe203812dd02099d3246 |
|
MD5 | ac27a8dc14f349a6327368dc5b227b40 |
|
BLAKE2b-256 | 5c6e2e7b537542a16c368f7e4e51ea97abc8d8626166ae0ab1f8bb2e4f81a2ee0b |
哈希值 用于 ahocorasick_rs-0.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | aca1e596c96656a39d88056e2994e9277bfb5229798f099055a54fee85d8919d |
|
MD5 | 378c003b75c55f6afd615f7b458d4496 |
|
BLAKE2b-256 | 8dc777caaaa69886776588ebc8f7992ffffd9070756ac419819c369d248312ab |
哈希值 用于 ahocorasick_rs-0.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3f800d0de51a0b9db47e42ff64e225af11b4ff957ac2098d94dcb927687f2985 |
|
MD5 | ce1a1a17f9c143d5a89b24c95453e407 |
|
BLAKE2b-256 | e64880bba6441b0777fb69e085f7a7bc56a3016e9e162fb4191afbea4fe28711 |
哈希值 用于 ahocorasick_rs-0.22.0-cp38-cp38-macosx_10_12_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2ec5d339c7aa53c0f0ea63915040cb3fe859adb2944e08d19b80b05dcf412c2f |
|
MD5 | 4695a98e7a8acbba3ab004b704848248 |
|
BLAKE2b-256 | 30921451bc02f2c47874c9aa09b132ffd53501b1753f441f7384e20ece7adf23 |