У меня есть код, который принимает строку символов и группирует любые повторяющиеся шаблоны. Например, если он принимает строку 'aaaaaabcdbcdbcd'
, он возвращает «6 (a) 3 (bcd)». В некоторых случаях он возвращает результат, который я не хочу. Если требуется 'aaabbabbabbabbabb'
, возвращается '3(a)2(b)4(abb)'
, когда лучшим результатом будет 'aa5(abb)'
.
Я также хочу убедиться, что он изменяет только строку, когда возвращаемое сжатие имеет меньшую длину:
len('aaaa') == len('4(a)'): output = 'aaaa'
len('aaaaa') > len('5(a)'): output = '5(a)'
len ('abcabc') == len('2(abc)'): output = 'abcabc'
len ('abcabcabc') > len('3(abc)'): output = '3(abc)'
У меня следующий код:
def _format_so(bchars, brep):
return '%i(%s)' % (brep, bchars) if bchars else ''
def char_rep(txt, _format=_format_so):
output, lastend = [], 0
for match in re.finditer(r'(?ms)(?P<repeat>(?P<chars>.+?)(?:(?P=chars))+)', txt):
beginpos, endpos = match.span()
repeat, chars = match.group('repeat'), match.group('chars')
if lastend < beginpos:
output.append(_format(txt[lastend:beginpos], 1))
output.append(_format(chars, repeat.count(chars)))
lastend = endpos
output = ''.join(output) + _format(txt[lastend:], 1)
return output
Я попытался взять данное решение и распаковать те, которые в нем не нуждались
. return
'3(a)2(b)4(abb)'
тогда я распаковал тех, кто в этом не нуждался
'aaabb4(abb)'
, но это не было решением вообще, потому что решение должно быть
'a5(abb)'
Каково будет правильное решение этой проблемы?