코딩도장에서 흥미로운 문제를 하나 봤는데, 어떤 문자열에서 짝수번째로 등장한 숫자만 *로 치환하는 문제였다.문제의 출처가 정규식 관련 사이트인 것 같은데, 원본 주소는 링크가 깨진관계로…
예를 들자면
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")
뭐 이런식으로 간단히 풀 수 있다는 이야기.