정규 표현식 심화
그루핑
문자열이 계속해서 반복되는지 조사하는 정규식을 작성하고 싶은 경우
메타 문자 ( )로 그룹을 만들어 줍니다.
그룹이 중첩되어 있는 경우는 바깥쪽부터 시작하여 안쪽으로 들어갈수록 인덱스가 증가한다.
예시 : (ABC)+ → ABC 문자열이 최소 1번 이상 계속해서 반복되는 여부
보통 그루핑은 반복되는 문자열을 찾을 때 사용합니다. 즉, 매치된 문자열 중에서 특정 부분의 문자열만 뽑아내기 위함이다.
실전에서는 이름 + " " + 전화번호 형태에서 '이름'만 뽑아내려는 경우
p = re.compile(r"
(\w+) # 이름
\s+ # " "
\d+[-]\d+[-]\d+ # 전화번호
", re.VERBOSE)
특징:
1) Backreferences
그루핑은 문자열 재참조가 가능합니다.
재참조는 메타 문자 \1 (정규식의 그룹 중 첫 번째 그룹을 가리킨다)
(그룹) + " " + 그룹과 동일한 단어인 경우 (\b\w+)\s+\1
2) Named Groups
그룹을 인덱스가 아닌 이름으로 참조할 수 있습니다.
그룹에 이름을 지어 주기 위해 다음의 확장 구문을 사용합니다
(?P<그룹명> ... )
가령, 전화번호에서 이름을 추출하는 정규식에서 (\w+) → (?P<name>\w+)
그룹 이름일 이용한 재참조할 때는 (?P=그룹이름) 이라고 사용합니다.
같은 정규식을 반복적으로 작성해야할 경우 유용합니다.
전방 탐색 (Lookahead Assertions)
패턴(컴파일한 결과물)이 일치하는 영역이 존재하여도 그 값이 제외되어서 나오는 패턴입니다.
전방 탐색 기호는 ?= 이며, 소괄호로 감싸주어야 합니다.
일치하는 영역에서 제외 됩니다!
2가지 종류가 있습니다.
긍정형 전방 탐색 - (?= ... ) : 해당되는 정규식과 매치되어야 하며 조건이 통과되어도 문자열이 소비되지 않습니다.
부정형 전방 탐색 - (?! ... ) : 해당되는 정규식과 매치되지 않아야 하며 조건이 통과되어도 문자열이 소비되지 않습니다.
(문자열이 소비되지 않습니다 : 검색에는 검색되지만 결과에는 제외된다는 의미)
후방 탐색 (Lookbehind)
긍정형 후방 탐색 - (?<=...) : =문자열에서 뒤에 있는 문자열을 탐색합니다. 해당 문자열을 제외한 나머지 문자들이 일치합니다.
부정형 후방 탐색 - (?<!...) : =문자열에서 뒤에 있는 문자열이 아닌 부분을 탐색하여 해당 문자열을 제외한 나머지 문자들이 일치합니다.
문자열 교체
sub( "바꿀 문자열", "대상 문자열")
바꾸기 횟수를 제어하려면 "count = 값"을 설정합니다.
sub( "바꿀 문자열", "대상 문자열", count = 1)
p = re.compile('(blue|white|red)')
p.sub('colorful', 'white socks and red T-shirt')
sub에 참조구문을 사용할 때 \g<1> 혹은 \g<그룹이름>을 이용합니다.
정규식의 Greedy vs Non-Greedy한 문자
* 은 매우 탐욕적인(Greedy) 문자여서 최대한의 문자열을 모두 소비합니다.
이 탐욕스러움을 제한하기 위해 비 탐욕적인(non-greedy)문자인 ?를 사용합니다.
가능한 가장 최소한의 반복을 수행하도록 도움을 줍니다.
? 문자는 주로 *?, +?, ??. {m,n}?와 같이 사용 됩니다.
'Data Analytics with python > [Natural Language]' 카테고리의 다른 글
[정규 표현식] regex 1편 (0) | 2023.01.28 |
---|---|
[텍스트 전처리] 1.Tokenization (토큰화) (2) | 2023.01.28 |
[텍스트 처리]자연어 처리를 위한 라이브러리 setting (0) | 2023.01.28 |
댓글