假设我有一个具有重复模式的数字,即存在一串重复的数字,以便形成有问题的数字。例如,这样的数字可能是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
有没有更好的方法来计算这个? (我愿意接受正则表达式,但我不知道如何在那里应用它,这就是为什么我没有将它包含在我的尝试中)
EDIT:
- 我不一定知道该数字有重复模式,所以我必须返回
None
如果没有的话。
- 现在,我只关心检测完全由重复模式组成的数字/字符串。然而,稍后,我可能还会对查找在几个字符之后开始的模式感兴趣:
magic_function(78961234123412341234)
会回来1234
作为图案,4
作为重复的次数,并且4
作为输入中模式首次出现的第一个索引
(.+?)\1+
尝试这个。抓住捕捉。看demo.
import re
p = re.compile(ur'(.+?)\1+')
test_str = u"1234123412341234"
re.findall(p, test_str)
添加锚点和标志Multiline
如果你想让正则表达式失败12341234123123
,应该返回None
.
^(.+?)\1+$
See demo.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)