缩短字符串

Nen*_*nad 1 python algorithm python-3.x

我有一个字符串:

a = babababbaaaaababbbab
Run Code Online (Sandbox Code Playgroud)

它需要缩短,所以它看起来像这样:

(ba)3(b)2(a)5ba(b)3ab
Run Code Online (Sandbox Code Playgroud)

所以基本上它需要占用所有重复的字符并写下它们重复的次数而不是打印它们.我设法做了一半:

from itertools import groupby
a = 'babababbaaaaababbbab'
grouped = ["".join(grp) for patt,grp in groupby(a)]
solved = [str(len(i)) + i[0] for i in grouped if len(i) >= 2]
Run Code Online (Sandbox Code Playgroud)

但这仅适用于重复但不是模式的字符.我知道我可以通过在字符串中找到'ab'模式来做到这一点,但这对于每个可能的字符串都是可行的.有没有人遇到类似的东西?

Ara*_*Fey 10

您可以使用正则表达式轻松完成此操作:

>>> repl= lambda match:'({}){}'.format(match.group(1), len(match.group())//len(match.group(1)))
>>> re.sub(r'(.+?)\1+', repl, 'babababbaaaaababbbab')
'(ba)3(b)2(a)5ba(b)3ab'
Run Code Online (Sandbox Code Playgroud)

这里解释不多.该模式(.+?)\1+匹配重复的字符序列,lambda函数将它们重写为表单(sequence)number.