找到重复出现的模式

ins*_*get 5 python regex pattern-recognition python-3.x

假设我有一个带有重复模式的数字,即存在一串数字,这些数字会重复以便产生相关数字.例如,可以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)
Run Code Online (Sandbox Code Playgroud)

然而,这看起来有点过于苛刻.我想我可以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
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

magic_function(78961234123412341234)

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

vks*_*vks 5

(.+?)\1+
Run Code Online (Sandbox Code Playgroud)

试试这个.抓住捕获.见演示.

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

re.findall(p, test_str)
Run Code Online (Sandbox Code Playgroud)

Multiline如果您希望正则表达式失败12341234123123,则添加锚点和标志,应该返回None.

^(.+?)\1+$
Run Code Online (Sandbox Code Playgroud)

演示.