Python-“窗口”迭代二进制对象?

2024-04-26 04:09:20 发布

您现在位置:Python中文网/ 问答频道 /正文

在比较函数中,我基本上是在一个长二进制对象(例如aaaAAAbbbBBB)中寻找模式(例如“aaaaaabbbb”)

我在向后遍历文件(我知道匹配将更接近结尾而不是开始),向正在检查匹配的变量添加1个字节:

1. aaaAAAbbbBB[B]
2. aaaAAAbbbB[BB]
3. aaaAAAbbb[BBB]
4. aaaAAAbb[bBBB]
5. ... 
n. aaa[AAAbbbBBB] 

找到匹配项,偏移量=-n

如果我知道我的模式有3个元素长,我想知道我是否可以简单地打开搜索变量而不是递增它-当匹配在列表中深度为+1000000个元素时,它会变得非常慢-相同数据的窗口视图将是:

^{pr2}$

找到匹配项,偏移量=-n

我当前的搜索结果如下:

if marker in f_data[-counter:]:
    offset = (len(f_data)-counter)+len(marker)
    return offset

在MATLAB中,我会使用数组寻址来遍历数组(例如调用window=a[5:8],window=a[4:7]等),但我认为在Python(2.7)中不可能实现

我可以看到一些关于使用滑动窗口的建议,(Rolling or sliding window iterator in Python-这看起来非常匹配),但我不知道如何实现它,或者它们引用了我不知道如何使用的lib。在

是否有一个内置函数来执行此操作?在


Tags: 对象函数in元素datalencounter二进制
3条回答

两件事:

(1)标准字符串类型保存字节,您可以将正则表达式与此一起使用。我可以建议您将对象拖进一个字符串中,然后执行regex搜索。在

(2)如果你真的想用强硬的方式来做,有http://docs.python.org/library/itertools.html#itertools.groupby

我认为这使用了您提到的window()迭代器函数。在

>>> l = "ABCABACAAASSD"
>>> from itertools import islice
>>>
>>> def window(seq, n=2):
...     "Returns a sliding window (of width n) over data from the iterable"
...     "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
...     it = iter(seq)
...     result = tuple(islice(it, n))
...     if len(result) == n:
...         yield result
...     for elem in it:
...         result = result[1:] + (elem,)
...         yield result
...
>>>
>>> data = [c for c in l] # get each byte/charactor as separate item in list
>>> data
['A', 'B', 'C', 'A', 'B', 'A', 'C', 'A', 'A', 'A', 'S', 'S', 'D']
>>> for idx, elements in enumerate(window(reversed(data), n=3)):
...     section = "".join(elements)
...     if section == "AAA":
...         print "found at {}!".format(idx)
...
found at 3!
>>>

解释:

  • reversed()接受一个列表并返回一个迭代器,其中元素的顺序相反
  • window()接受一个iterable对象(list、tuple、iterator)并返回n个元素,每次移动索引1个元素。在
  • enumerate()接受iterable并简单地附加一个计数器,因此它将返回counter/position和给定的元素项。在

为什么不直接使用rfind()或{}?在

haystack = "aaaAAAbbbBBB"
needle   = "AAA"

pos = haystack.rfind(needle)

if pos >= 0:
    print "found at", pos - len(haystack)
else:
    print "not found"

相关问题 更多 >