擅长:python、mysql、java
<p>如果可以绑定查询,则可以使用字符串的单次传递。比较的数量将是<code>length of string * (max_length - min_length)</code>,因此将线性缩放。在</p>
<pre><code>s = 'AAACACGTACGTAATTCCGTGTGTCCCCTATACGTATACGTTT'
def find_repeats(s, max_length, min_length=2):
for i in xrange(len(s)):
for j in xrange(min_length, max_length+1):
count = 1
while s[i:i+j] == s[i+j*count:i+j*count+j]: count += 1
if count > 1:
yield s[i:i+j], i, count
for pattern, position, count in find_repeats(s, 6, 2):
print "%6s at region (%d, %d), %d repeats" % (pattern, position, position + count*len(pattern), count)
</code></pre>
<p>输出:</p>
^{pr2}$
<p>请注意,这比regexp的答案捕捉到更多的重叠模式,但是如果不了解您认为的<strong>好的</strong>匹配,就很难进一步减少它,例如,<code>TATACG</code>比<code>ATACGT</code>好?在</p>
<p>附加:使用dict返回匹配项是个坏主意,因为模式不是唯一的。在</p>