정규식으로 짝수번째 숫자만 치환하기

코딩도장에서 흥미로운 문제를 하나 봤는데, 어떤 문자열에서 짝수번째로 등장한 숫자만 *로 치환하는 문제였다.문제의 출처가 정규식 관련 사이트인 것 같은데, 원본 주소는 링크가 깨진관계로…

예를 들자면

a1b2c3d4~e5f_6

과 같은 문자열이 있을 때 이중 숫자는 1, 2, 3, 4, 5, 6인데 그 중에서 짝수 번째로 등장하는 숫자만 *로 치환하는 것이다.

파이썬 구현은 매우 쉬운데….

def unvailEveryOtherDigits(str):
    s = []
    occ = 0
    for c in str:
        if c in "0123456789":
            c += 1
            if c % 2 == 0:
                s.append('*')
            else:
                s.append(c)
        else:
            s.append(c)
    return "".join(s)

이걸 정규식으로 풀어보자. 이걸 정규식으로는 못할 거라는 의견이 많은데, (숫자)(숫자가아닌것)(숫자) 이렇게 3개의 그룹을 매칭하고, 각 그룹 중 세번째 그룹만 *으로 치환하면 된다.

따라서

import re
print re.sub(r'(\d)(.*?)(\d)', '\\1\\2*', "a1b2c3d4e~f5g6")

뭐 이런식으로 간단히 풀 수 있다는 이야기.