Измените существующее регулярное выражение так, чтобы оно группировало символы только тогда, когда длина возвращаемого значения меньше - PullRequest
0 голосов
/ 01 мая 2020

У меня есть код, который принимает строку символов и группирует любые повторяющиеся шаблоны. Например, если он принимает строку '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)'

Каково будет правильное решение этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...