假设我有一个带有重复模式的数字,即存在一串数字,这些数字会重复以便产生相关数字。例如,这样的数字可能是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
有更好的方法来计算吗? (我会对正则表达式持开放态度,但我不知道如何在那里应用它,这就是为什么我没有在我的尝试中包含它)
修改:
None
。 magic_function(78961234123412341234)
将返回1234
作为模式,4
作为重复的次数,4
作为模式首次出现的输入中的第一个索引
答案 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