본문 바로가기

문돌이 존버/코딩연습

파이썬 정규표현식(regexp) [], ^, |, 기호(+, ?, ., *)

반응형

유명한 스탠포드 대학의 Jurafsky 교수가 제공하는 Regular Expressions PPT를 사용해 첨부 자료를 작성했습니다.  


큰 괄호 [] 안에 있는 문자가 패턴이 된다. 아래 예시를 살펴보자.

[wW]: 소문자 w 및 대문자 W라면 매치 (or의 관계)
[123456789]: 1~9 중 하나의 숫자

(주의) [wW]의 경우, Wwbook에서 "wbook"에만 매치된다. 즉 w와 W 중 하나에만 해당되는 것이다. 아래 예시를 참고하자.

[] 안에 모든 문자를 일일이 적어주기는 귀찮기에 Range를 사용해도 된다. 여전히 주의할 점은 or의 관계라는 것이다. 두 번째 [a-z]의 경우, 예시 문장이 모두 소문자로 이루어져 있지만 "m"만 매치되었다. 

[A-Z]: 영어 대문자
[a-z]: 영어 소문자
[0-9]: 숫자

대괄호 맨 앞에 ^ 표시를 쓰면 not의 의미이다. ^ 뒤에 나오는 표현을 제외한 것을 매치시킨다. 주의할 것은 대괄호 맨 앞에 위치한 ^만 not의 역할이며, 이후에 등장하는 ^는 기호 그대로를 뜻한다. 

[^A-Z]: 영어 대문자가 아닌 것들
[^Ss]: 대문자 S 또는 소문자 s가 아닌 것들
[^e^]: 소문자 e 또는 기호 ^가 아닌 것들
[a^b]: a^b

 

<[a^b] 부분 및 예시 문장 오타 수정>

여러 문자를 매치시키는 경우를 살펴보자. 문자 | 은 or의 의미를 지닌다. 따라서 문장 안에 두 개의 패턴이 들어있다면 모두 매치시킬 것이다.

groundhog|woodchuck -> groundhog OR woodchuck 
yours|mine -> yours OR mine
a|b|c -> a OR b OR c
[gG]roundhoog|[Ww]oodchuck -> groundhoog OR Groundhoog OR Woodchuck OR woodchuck

<[abc] 부분 수정>

기호(?, *, +, .)로 패턴을 나타낼 수도 있다.

? -> 하나 있거나, 하나도 없거나
* -> 없거나, 하나 이상 있거나
+ -> 하나 이상 있을 경우
. -> 어떠한 문자, 기호, 숫자 

또한, '^'와 '달러(현재 내 블로그는 달러를 쓰면 latex 문법이 적용되어 쓰지 않겠다...)' 표시를 사용해 위치를 파악하는 패턴도 있다. 대괄호 외부에 ^를 사용할 경우, 문자열 맨 앞에 있는 것인지를 확인한다. 달러 표시는 문자열 맨 뒤를 나타낸다. 

^[A-Z] -> 영어 대문자가 문자열 맨 앞에 나올 경우
^[^A-Za-z] -> 영어 대문자, 소문자가 아닌 것이 문자열 맨 앞에 나올 경우
(참고): 영어 대문자, 소문자 아닌 것에는 각종 기호, 줄바꿈, 띄어쓰기 등이 해당된다
\.$ -> 기호 .를 찾는 경우
.달러 -> 문자열 맨 뒤에 나오는 어떠한 문자, 기호, 숫자

잠깐 연습을 해보고 가자. 모든 문장에서 "the" 라는 단어를 찾고자 한다면 어떠한 정규표현식을 사용해야 할까? 아래와 같이 작성할 경우 문제가 무엇일까?

문장 맨 앞 또는 맨 뒤에 나오는 the나 The를 발견하지 못하는 문제가 발생한다. 이것까지 매치시키려면 아래와 같이 ()를 따로 추가해줘야 한다. 그리고 ^와 $를 통해 문자열 맨 앞인지, 뒤인지도 표시해주면 된다. 

(^|[^a-zA-Z])[tT]he -> 문장 맨 앞에 나오는 the OR The, 영어 대문자가 아닌 것 뒤에 나오는 the OR The 

지금까지 영어를 다뤘지만 이제 한글도 매치시켜보자. 

[가-힣]맛 -> 맛 앞에 하나의 글자(한글)만 매칭된다

[가-힣]맛 -> 맛 앞에 하나 이상의 글자가 매칭된다

아래는 여러 가지 정규표현식(+, (), ?)을 섞어 만든 결과로 각자 많은 것을 시도해보기 바란다.

특히 ()을 통해 그룹핑한 결과를 보면 이해가 쉬울 것 같다.

이제 정규표현식을 통해 원하는 문자열 혹은 기호 등으로 대치해보자. 영어로 설명하자면 replace에 해당한다. 

숫자에 해당되는 부분을 # 으로 replace

전화번호에서 지역 번호를 () 형태로 replace
(참고) 파이썬에선 역참조로 \1 을 사용하지만, 해당 사이트는 자바스크립트로 $1 을 사용한다
역참조란, 그룹핑한 서브 표현식에 해당하는 패턴을 참조한다는 것이다
\n -> n 번째 그룹의 서브 표현식 패턴을 참조

숫자가 3번 혹은 4번 연속되는 경우를 찾고 싶다면 아래처럼 해보자. 중괄호 {n} 는 n 번 반복한다는 의미이다. 

위에서 참고로 말한 역참조를 예제를 통해 살펴보자. 

([0-9])\1 -> 그룹핑된 숫자가 있다면 이 패턴을 다시 참조하여 반복되는 경우만 매칭한다

1122의 경우, 처음 숫자 1이 등장했고 이를 역참조하면 11이 되므로 11이 하나의 그룹으로 묶인다. 2가 등장한 순간, 이를 역참조하면 22가 되므로 22가 또 하나의 그룹으로 묶인다. 그렇다면 똑같은 숫자가 4번 연속되는 경우를 찾으려면 어떻게 해야 할까?

아래와 같이 역참조하는 횟수를 정해주면 된다. 역참조를 3번 하라고 했기 때문에 처음 2를 보고, 222를 살펴보게 되며 2222가 매치되어 하나의 그룹으로 묶인다. 

아래처럼 4번 연속된 숫자가 2개 있는 경우를 매치할 수 있다. 이때 주의할 것은 두 번째 연속 숫자를 확인하려면 \2를 사용해야 한다는 것이다. 2222 4444에서 4444는 2번째 그룹에 해당되기 때문이다. 

replace를 할 때 2번째 그룹을 참고하라고 한다면 아래처럼 4가 출력된다.

728x90
반응형