이 포스팅은 Regular Expression 시리즈 12 편 중 10 번째 글 입니다.
목차
개요
sub
메서드를 사용하면 정규식과 매치되는 부분을 다른 문자로 쉽게 바꿀 수 있다.
>>> p = re.compile('(blue|white|red)')
>>> p.sub('colour', 'blue socks and red shoes')
'colour socks and colour shoes'
첫번째 변수는 바꿀 문자열, 두번째 변수는 대상 문자열이다. 그런데 만약 한번만 바꾸고 싶다면 어떻게 해야할까? 세번째 변수로 count를 넘기면 된다.
>>> p.sub('colour', 'blue socks and red shoes', count=1)
'colour socks and red shoes'
처음 일치한 부분만 변경된 것을 확인할 수 있다.
subn
역시 sub
와 동일한 기능을 하지만 반환 결과를 튜플로 돌려준다는 차이가 있다. 돌려준 튜플의 첫 번째 요소는 변경된 문자열이고, 두 번째 요소는 바꾸기가 발생한 횟수이다.
>>> p = re.compile('(blue|white|red)')
>>> p.subn( 'colour', 'blue socks and red shoes')
('colour socks and colour shoes', 2)
참조 구문 사용하기
참조 구문은 그루핑에서 검색된 것에 대해 네이밍을 하는 기능을 말했다. 이런 기능을 sub
와 함께 사용할 경우 포맷을 변경할 수 있다.
>>> p = re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")
>>> print(p.sub("\g<phone> \g<name>", "park 010-1234-1234"))
010-1234-1234 park
위 예는 이름 + 전화번호
의 문자열을 전화번호 + 이름
으로 바꾸는 예이다. sub
의 바꿀 문자열 부분에 \g<그룹이름>
을 사용하면 정규식의 그룹 이름을 참조할 수 있게 된다.
다음과 같이 그룹 이름 대신 참조 번호를 사용해도 마찬가지 결과를 돌려준다.
>>> p = re.compile(r"(?P<name>\w+)\s+(?P<phone>(\d+)[-]\d+[-]\d+)")
>>> print(p.sub("\g<2> \g<1>", "park 010-1234-1234"))
010-1234-1234 park
함수를 넣어 사용하기
>>> def hexrepl(match):
... value = int(match.group())
... return hex(value)
...
>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
'Call 0xffd2 for printing, 0xc000 for user code.'
hexrepl 함수는 match 객체(위에서 숫자에 매치되는)를 입력으로 받아 16진수로 변환하여 돌려주는 함수이다. sub의 첫 번째 매개변수로 함수를 사용할 경우 해당 함수의 첫 번째 매개변수에는 정규식과 매치된 match 객체가 입력된다. 그리고 매치되는 문자열은 함수의 반환 값으로 바뀌게 된다.