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
になる.