【问题标题】:Find the repeating substring a string is composed of, if it exists查找组成字符串的重复子字符串(如果存在)
【发布时间】:2017-03-26 22:36:32
【问题描述】:

如何在使用所有字符的同时将普通字符串拆分为尽可能多的相同部分。例如

a = "abab"

将返回 "ab",而使用

b= "ababc"

它会返回"ababc",因为它不能使用所有字母分成相同的部分。

【问题讨论】:

标签: python string python-3.x pattern-matching


【解决方案1】:

这与How can I tell if a string repeats itself in Python? 非常相似,但并不完全相同——不同之处在于该问题仅要求确定字符串是否由相同的重复子字符串组成,而不是重复子字符串(如果有)是什么。

对该问题的接受(以及迄今为止执行的bestanswer 可以调整为返回重复字符串(如果有的话):

def repeater(s):
    i = (s+s)[1:-1].find(s)
    if i == -1:
        return s
    else:
        return s[:i+1]

例子:

>>> repeater('abab')
'ab'
>>> repeater('ababc')
'ababc'
>>> repeater('xyz' * 1000000)
'xyz'
>>> repeater('xyz' * 50 + 'q')
'xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzq'

【讨论】:

    【解决方案2】:

    似乎重复子串没有前后字母,所以也可能是这样:

    In[4]: re.sub(r'^([a-z]+)\1$',r'\1','abab')
    Out[4]: 'ab'
    In[5]: re.sub(r'^([a-z]+)\1$',r'\1','ababc')
    Out[5]: 'ababc' 
    

    ([a-z]+) 表示子串,\1 表示重复。

    编辑:

    re.sub(r'^([a-z]+)\1{1,}$',r'\1','abcabcabcabc')
    'abc'
    

    【讨论】:

    • 这仅在子字符串恰好重复一次时才有效。它不适用于ababab
    • 多次重复编辑。
    猜你喜欢
    • 2014-05-09
    • 2020-02-24
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多