我有一个字符串:
a = babababbaaaaababbbab
它需要缩短,所以看起来像这样:
(ba)3(b)2(a)5ba(b)3ab
所以基本上它需要占用所有重复的字符并写下它们重复的次数而不是打印它们。 我设法做了一半:
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]
但这仅适用于重复但不是模式的字符。我明白,我可以通过找到' ab'字符串中的模式,但这对于每个可能的字符串都是可行的。有没有人遇到过类似的东西?
答案 0 :(得分:10)
您可以使用regex轻松完成此操作:
>>> 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'
这里解释不多。模式(.+?)\1+
匹配重复的字符序列,lambda函数将它们重写为(sequence)number
形式。
答案 1 :(得分:0)
这就是我提出的,代码很乱,但我只是想快点玩,所以我让它像这样
a = 'babababbaaaaababbbab'
def compress(text):
for i in range(1, len(text) // 2):
for j, c in enumerate(text[:-i if i > 0 else len(text)]):
pattern = text[j:i+j]
new_text = pattern_repeats_processor(pattern, text, j)
if new_text != text:
return compress(new_text)
return text
def pattern_repeats_processor(pattern, text, i):
chunk = pattern
count = 1
while chunk == pattern and i + (count + 1) * len(pattern) < len(text):
chunk = text[i + count * len(pattern): i + (count + 1) * len(pattern)]
if chunk == pattern:
count = count + 1
else:
break
if count > 1:
return text[:i] + '(' + pattern + ')' + str(count) + text[i + (count + 0) * len(pattern):]
return text
print(compress(a))
print(a)
它使 babababbaaaaababbbab =&gt; (BA)图3(b)图2(a)5BA(b)中3AB
P.S。当然,划船的答案更好,甚至相当令人印象深刻
答案 2 :(得分:-2)
我不确定你到底在寻找什么,但希望这会有所帮助。
A=a.count('a')
B=a.count('b')
AB=a.count('ab')
BAB=a.count('bab')
BA=a.count('ba')
print(A,'(a)',B,'(b)',AB,'(ab)',BAB,'(bab)',BA,'(ba)')