() : Group
특정 문자가 아니라, 특정 문자열이 반복되는지 확인할 때에는 () 메타 문자를 이용해 문자열을 그룹화하여 확인할 수 있다.
import re
g = re.search('(ABC)+', 'ABCABCABC OK?')
print(g)
re.groups()
() 메타 문자로 확인한 문자열 목록을 튜플 형태로 반환한다.
import re
g = re.search(r'(\d{2})-(\d{3,4})-(\d{4})', '02-123-1234')
print(g.groups())
re.group(int)
() 메타문자로 확인한 문자열을 반환한다.
매개변수로 전달된 값이 없거나 0인 경우에는 일치한 모든 문자열을 반환한다. 매개변수로 전달된 값이 0이 아닌 숫자 n인 경우에는 n번째 그룹에 일치한 문자열을 반환한다.
import re
g = re.search(r'(\d{2})-(\d{3,4})-(\d{4})', '02-123-1234')
print(g.group())
print(g.group(0))
print(g.group(2))
group 함수를 사용하면 일치한 문자열 중 원하는 그룹만 뽑아낼 수 있다.
group 재참조
한 번 그룹화한 문자열은 '\n' 문자로 재 참조할 수 있다. 인덱스는 1부터 시작한다.
import re
g = re.search(r'(\d{3})-(\d{4})-\2', '010-1234-1234')
print(g.group())
print(g.group(2))
print(g.group(3))
이 경우에는 \d{4}에 일치한 문자열이 - 뒤에서 한 번 더 나와야 한다는 의미이다. \2에 의해 일치한 문자열은 그룹으로 취급하지 않는다.
일치한 1234가 아니라 다른 문자열이 오는 경우에는 오류가 발생한다.
import re
g = re.search(r'(\d{3})-(\d{4})-\2', '010-1234-5678')
print(g.group())
print(g.group(2))
group 이름 붙이기
그룹이 너무 많아지는 경우에는 그룹을 식별하기 어려워진다. 이런 경우를 위해 () 문자로 그룹을 지정할 때 그룹의 이름을 지정할 수 있다. 그룹명은 () 메타 문자 내 맨 앞에 아래와 같은 형식으로 설정한다.
?P<group_name>
# 예시
(?P<prefix>\d{3}) # 숫자 세 자리를 prefix라는 이름으로 그룹화
예시 코드
import re
g = re.search(r'(?P<prefix>\d{3})-(\d{4})-\d{4}', '010-1234-5678')
print(g.group('prefix'))
그룹 이름으로 재참조할 때에는 (?P=group_name) 형식으로 한다.
import re
g = re.search(r'(\d{3})-(?P<sec>\d{4})-(?P=sec)', '010-1234-1234')
print(g.group())
참고 문서