본문 바로가기

딥러닝/[딥 러닝을 이용한 자연어 처리 입문]딥러닝

정규 표현식(Regular Expression)

1.정규 표현식 문법과 모듈 함수

파이썬에서는 정규 표현식 모듈 re을 지원

 

1) 정규 표현식 문법

특수 문자설명

. 한 개의 임의의 문자를 나타냅니다. (줄바꿈 문자인 \n는 제외)
? 앞의 문자가 존재할 수도 있고, 존재하지 않을 수도 있습니다. (문자가 0개 또는 1개)
* 앞의 문자가 무한개로 존재할 수도 있고, 존재하지 않을 수도 있습니다. (문자가 0개 이상)
+ 앞의 문자가 최소 한 개 이상 존재합니다. (문자가 1개 이상)
^ 뒤의 문자열로 문자열이 시작됩니다.
$ 앞의 문자열로 문자열이 끝납니다.
{숫자} 숫자만큼 반복합니다.
{숫자1, 숫자2} 숫자1 이상 숫자2 이하만큼 반복합니다. ?, *, +를 이것으로 대체할 수 있습니다.
{숫자,} 숫자 이상만큼 반복합니다.
[ ] 대괄호 안의 문자들 중 한 개의 문자와 매치합니다.[a-z]와 같이 범위를 지정할 수도 있습니다.
[^문자] 해당 문자를 제외한 문자를 매치합니다.
l AlB와 같이 쓰이며 A 또는 B의 의미를 가집니다.

 

문자 규칙설명

\\\ 역 슬래쉬 문자 자체를 의미합니다
\\d 모든 숫자를 의미합니다. [0-9]와 의미가 동일합니다.
\\D 숫자를 제외한 모든 문자를 의미합니다. [^0-9]와 의미가 동일합니다.
\\s 공백을 의미합니다.
\\S 공백을 제외한 문자를 의미합니다.
\\w 문자 또는 숫자를 의미합니다.
\\W 문자 또는 숫자가 아닌 문자를 의미합니다. 

2) 정규표현식 모듈 함수

모듈 함수설명

re.compile() 정규표현식을 컴파일하는 함수입니다. 다시 말해, 파이썬에게 전해주는 역할을 합니다. 찾고자 하는 패턴이 빈번한 경우에는 미리 컴파일해놓고 사용하면 속도와 편의성면에서 유리합니다.
re.search() 문자열 전체에 대해서 정규표현식과 매치되는지를 검색합니다.
re.match() 문자열의 처음이 정규표현식과 매치되는지를 검색합니다.
re.split() 정규 표현식을 기준으로 문자열을 분리하여 리스트로 리턴합니다.
re.findall() 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열을 찾아서 리스트로 리턴합니다. 만약, 매치되는 문자열이 없다면 빈 리스트가 리턴됩니다.
re.finditer() 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열에 대한 이터레이터 객체를 리턴합니다.
re.sub() 문자열에서 정규 표현식과 일치하는 부분에 대해서 다른 문자열로 대체합니다.

2.정규 표현식 실습

1) . 기호

.은 한 개의 임의의 문자를 나타냅니다.

2)?기호

?는 ?앞의 문자가 존재할 수도 있고 존재하지 않을 수도 있는 경우를 나타냅니다. 

 

3)*기호

*은 바로 앞의 문자가 0개 이상일 경우를 나타냅니다. 앞의 문자는 존재하지 않을 수도 있으며, 또는 여러 개일 수도 있습니다.

[코드7-10]

 

4)+기호

+는 *와 유사합니다. 다른 점은 앞의 문자가 최소 1개 이상이어야 합니다.

 

5) ^기호

^는 시작되는 문자열을 지정합니다.

 

6) {숫자} 기호

문자에 해당 기호를 붙이면, 해당 문자를 숫자만큼 반복한 것을 나타냅니다.

7) {숫자1, 숫자2} 기호

문자에 해당 기호를 붙이면, 해당 문자를 숫자1 이상 숫자2 이하만큼 반복합니다.

8) {숫자,} 기호

문자에 해당 기호를 붙이면 해당 문자를 숫자 이상 만큼 반복합니다.

만약 {0,}을 쓴다면 *와 동일한 의미가 되며, {1,}을 쓴다면 +와 동일한 의미가 됩니다.

 

9) [ ] 기호

[ ]안에 문자들을 넣으면 그 문자들 중 한 개의 문자와 매치라는 의미를 가집니다.

 

10) [^문자] 기호

[^문자]는 ^기호 뒤에 붙은 문자들을 제외한 모든 문자를 매치하는 역할을 합니다.

 

3. 정규 표현식 모듈 함수 예제

 

(1) re.match() 와 re.search()의 차이

search()가 정규 표현식 전체에 대해서 문자열이 매치하는지를 확인

match()는 문자열의 첫 부분부터 정규 표현식과 매치하는지를 확인

(2) re.split()

split() 함수는 입력된 정규 표현식을 기준으로 문자열들을 분리하여 리스트로 리턴합니다.

(3) re.findall()

findall() 함수는 정규 표현식과 매치되는 모든 문자열들을 리스트로 리턴합니다.

단, 매치되는 문자열이 없다면 빈 리스트를 리턴합니다.

(4) re.sub()

sub() 함수는 정규 표현식 패턴과 일치하는 문자열을 찾아 다른 문자열로 대체할 수 있습니다.

4. 정규 표현식을 이용한 토큰화

NLTK에서는 정규 표현식을 사용해서 단어 토큰화를 수행하는 RegexpTokenizer를 지원합니다.

RegexpTokenizer()에서 괄호 안에 하나의 토큰으로 규정하기를 원하는 정규 표현식을 넣어서 토큰화를 수행합니다.

gaps=true는 해당 정규 표현식을 토큰으로 나누기 위한 기준으로 사용한다는 의미입니다.

만약 gaps=True라는 부분을 기재하지 않는다면, 토큰화의 결과는 공백들만 나오게 됩니다. 

\w+는 문자 또는 숫자가 1개 이상인 경우를 의미합니다.

\s+는 공백을 찾아내는 정규표현식.