找到重复出现的模式

时间:2014-11-02 20:11:45

标签: python regex python-3.x pattern-recognition

假设我有一个带有重复模式的数字,即存在一串数字,这些数字会重复以便产生相关数字。例如,这样的数字可能是1234123412341234,通过重复数字1234创建 我想做的是找到重复自己创建数字的模式。因此,给定1234123412341234,我想计算1234(也许4,以表示1234重复4次以创建1234123412341234

我知道我可以这样做:

def findPattern(num):
    num = str(num)
    for i in range(len(num)):
        patt = num[:i]
        if (len(num)/len(patt))%1:
            continue
        if pat*(len(num)//len(patt)):
            return patt, len(num)//len(patt)

然而,这看起来有点过于苛刻。我想我可以使用itertools.cycle来比较两个相等的循环,但这并没有真正成功:

In [25]: c1 = itertools.cycle(list(range(4)))

In [26]: c2 = itertools.cycle(list(range(4)))

In [27]: c1==c2
Out[27]: False

有更好的方法来计算吗? (我会对正则表达式持开放态度,但我不知道如何在那里应用它,这就是为什么我没有在我的尝试中包含它)

修改

  1. 我不一定知道这个号码有重复的模式,所以如果没有,我必须返回None
  2. 现在,我只关心检测完全由重复模式构成的数字/字符串。但是,稍后,我可能也会对找到几个字符后面的模式感兴趣:
  3.   

    magic_function(78961234123412341234)

    将返回1234作为模式,4作为重复的次数,4作为模式首次出现的输入中的第一个索引

2 个答案:

答案 0 :(得分:5)

(.+?)\1+

试试这个。抓住捕获。请参阅demo

import re
p = re.compile(ur'(.+?)\1+')
test_str = u"1234123412341234"

re.findall(p, test_str)

如果您希望Multiline上的正则表达式失败,请添加锚点并标记12341234123123,这应该返回None

^(.+?)\1+$

请参阅demo

答案 1 :(得分:0)

查找重复模式和重复次数的一种方法是使用此模式:

(.+?)(?=\1+$|$)  

w / g选项。
它将返回重复的模式和匹配数量(重复次数)
非重复模式(失败)将仅返回" 1 "比赛
重复模式将返回 2或更多匹配(重复次数) Demo