0

我有一个由 1 和 0 组成的传入字符串;一点一滴建成。它的尾部将在某些时候匹配两种模式之一,例如 1001 和 0101,当它匹配时,它会终止搜索(这是一次迭代 - 每次迭代的模式都会有所不同)。

我想测试任何一种模式,然后记下哪个模式终止了字符串,因此这次迭代。然后我需要在传入的字符串上重复这个过程 - 使用不同的模式。

我已经对此进行了编码,但恕我直言,这很丑陋,而且我确信在 Python 中有一种更优雅、更有效的方法(我真的是新手)。我目前的做法是这样的:

pattern1 = getPattern1()
pattern2 = getPattern2()


while 1:

    s += nextBit()

    if s.count(pattern1) and s.count(pattern2): 

        if s.find(pattern1) < s.find(pattern2):
            tot1 += 1
        else:
            tot2 += 1

        s = ''

     ...
4

1 回答 1

0

首先,编写正确的可读代码并清楚地表达您的意图,然后测量性能并在必要时进行优化。

您可以使用正则表达式同时搜索和提取模式:

import re

# match any of the patterns literally at the end of string
regex = re.compile(r"(?:%s)$" % "|".join(map(re.escape, patterns)))
def getpattern(s):
    m = regex.search(s)
    return m and m.group()

maxlen = max(map(len, patterns))
count = dict.fromkeys(patterns, 0)
s = ""
for bit in iter(nextBit, ""): # get bits until empty string
    s += bit
    p = getpattern(s)
    if p: # found pattern
       count[p] += 1
       s = ""
    elif len(s) > maxlen: # limit s size
       s = s[-maxlen:]
print(count)

如果输入中的模式很少见,则.endswith(patterns)基于 - 的解决方案可能更有效。

为了加快速度,请考虑一次读取多个位并在更大的缓冲区中计算模式。

于 2013-02-02T11:02:22.320 回答