"Articles are my own, not views of my employer"

就活や転職に役立てるためTips投稿や競プロwriteupを行いプレゼンスを高める自分用備忘録です

Python3の正規表現を使ってランレングス符号化

正規表現についてちょっと学んだので「個人的メモ」.

やったのは正規表現

  • 後方参照
  • 連続マッチ

かな.

結局のところ,次々マッチさせたいならfinditerを使え,という結論(牛刀で切ります).

コツは()で繰り返し後方参照したいな,と思う部分をそのままfinditerにぶち込むこと. それをgroup()メソッドで取り出すこと.

import re

def compress(s):
    ans = ''
    m = re.finditer(r'(.)\1*', s)
    for i in m:
        seq = i.group()
        ans += str(len(seq))
        ans += seq[0]
    return ans

def decompress(s):
    m = re.finditer(r'\d+|[a-zA-Z]+', s)
    n_repeat = None
    ans = ''
    for i in m:
        if n_repeat is None:
            n_repeat = int(i.group())
        else:
            ans += i.group() * n_repeat
            n_repeat = None
    return ans

このとき,

>>> s = 'AAABBCDEFFFFF'
>>> s = compress(s)
>>> print(s)
3A2B1C1D1E5F
>>> s = decompress(s)
>>> print(s)
AAABBCDEFFFFF

になる.