본문 바로가기
Data Analytics with python/[Natural Language]

[정규 표현식] regex 2편

by 보끔밥0130 2023. 1. 28.
728x90

정규 표현식 심화

 

그루핑

문자열이 계속해서 반복되는지 조사하는 정규식을 작성하고 싶은 경우

 

메타 문자 ( )로 그룹을 만들어 줍니다.

 

그룹이 중첩되어 있는 경우는 바깥쪽부터 시작하여 안쪽으로 들어갈수록 인덱스가 증가한다.

 

예시 : (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}?와 같이 사용 됩니다.

728x90

댓글