【问题标题】:Finding the recurring pattern寻找循环模式
【发布时间】:2014-12-29 11:53:07
【问题描述】:

假设我有一个具有重复模式的数字,即存在一串重复自身的数字以生成相关数字。例如,这样的数字可能是 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. 现在,我只关心检测完全由重复模式组成的数字/字符串。但是,稍后,我可能还会有兴趣寻找以几个字符开头的模式:

magic_function(78961234123412341234)

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

【问题讨论】:

  • 771177117711 这样的东西怎么样?这非常困难。
  • @AlexThornton:这是7711 的模式,3 次,或者1177 的模式,2 次(带有前导和尾随噪声)
  • 正则表达式失败了,烦人。我看看我能不能想到什么。
  • @AlexThornton regex101.com/r/hO3xY3/3 它不会失败
  • @vks 抱歉,我没有看到您的编辑。

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


【解决方案1】:
(.+?)\1+

试试这个。抓拍。见demo

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

re.findall(p, test_str)

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

^(.+?)\1+$

demo

【讨论】:

  • 这行p = re.compile(ur'(.+?)\1+')应该改成p = re.compile(r'(.+?)\1+')?
  • @muammar r u on python3?
【解决方案2】:

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

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

带有g 选项。
它将返回重复模式和匹配次数(重复次数)
非重复模式(失败)将仅返回“1”匹配
重复模式将返回 2 个或更多 个匹配项(重复的次数)。
Demo

【讨论】:

  • 你能发布一个你的代码发现不匹配等的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2017-08-17
  • 2022-06-16
  • 2014-09-30
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多