데이터분석가/Coding

[R/Python] 정규표현식

Jeenee_Lee 2020. 2. 27. 14:35

정규표현식은 R 또는 Python에서만 사용하는 표현 방법이 아니라 기본적으로 프로그래밍에서 사용하게 된다. 

가령, 어떤 사람의 정보가

홍길동    010-0000-0000    email@email.co.kr    

와 같이 나뉜 text라면 email 주소를 찾아내고 싶을 때 쓸 수 있는 방법으로 정규표현식을 이용한 전처리 방법이 된다.

 

R과 Python을 사용하고 있어 두 프로그램 상에서는 테스트 완료 후 글을 작성하였으나, 다른 프로그램에선 테스트하지 않았으므로 테스트가 필요할 수 있습니다.

 

R에서 정규표현식(regex)를 사용하려면 아래 링크를 참조한다.

[비정형 데이터 전처리를 위한 함수]

 

이 글에서는 Python을 기반으로 정규표현식을 적용해 나타나는 결과와 해석을 작성한다.


정규표현식 적용을 위해 기본 module인 re 를 사용한다. (re: regular expression)

예시를 위해 간단한 함수 find_string을 정의한다.

이 module을 사용하지 않더라도 pandas dataframe 내에서 전처리할 경우 str method를 사용할 수 있다.

추후 이에 대한 글도 작성할 예정.

import re
def find_string(x:list, pattern):
    # x: pattern을 찾고 싶은 list with string
    # pattern: 찾고 싶은 pattern
    
    p = re.compile(pattern)
    return list(filter(p.search, x))

메타문자

문자 자체가 아닌, 다른 의미를 갖는 기호들을 메타 문자(meta characters)라고 부른다.

 

| : "or"의 개념으로 사용.

find_string(["cat", "dog", "rabbit"], "cat|tiger")	# ['cat']

"cat" 또는 "tiger"를 찾는다.

 

^pattern : pattern으로 시작하는 단어

find_string(["cat", "dog", "rabbit"], "^d")		# ['dog']

^d라는 패턴을 부여하였으므로 d로 시작하는 글자를 찾는다.

 

pattern$ : pattern으로 끝나는 단어

find_string(["cat", "dog", "rabbit"], "t$")		# ['cat', 'rabbit']
참고: 현재 define한 함수에서는 re.search를 사용하고 있으나, 만약 re.match를 사용하는 경우 match는 단어의 시작점부터 찾기 때문에 결과가 나타나지 않는다. 따라서 동일한 작업을 위해 t 앞에 다른 문자가 나올 수 있다는 지정이 필요하다.
reference : https://docs.python.org/3/howto/regex.html#more-metacharacters match() versus search()
def find_string_match(x:list, pattern):
    # x: pattern을 찾고 싶은 list with string
    # pattern: 찾고 싶은 pattern
    
    p = re.compile(pattern)
    return list(filter(p.match, x))

find_string_match(["cat", "dog", "rabbit"], "t$")		# []
	# 시작 위치에서 일치하는 문자가 없어 empty list 출력
find_string_match(["cat", "dog", "rabbit", "t"], ".*t$")	# ['cat', 'rabbit', 't']
find_string_match(["cat", "dog", "rabbit", "t"], ".+t$")	# ['cat', 'rabbit']

첫번째 코드에서 t가 시작 위치(단어의 첫 글자)에 일치하는 경우가 없어 아무런 return 값이 없다.

. : 정규표현식에서 .은 '임의의 문자'를 의미한다. 단, 이때 개행(줄바꿈, \n)은 제외된다.

* : 0회 이상을 의미한다.

+ : 1회 이상을 의미한다.

 

반복하는 횟수를 지정하려면 { } 괄호를 이용한다.

{m,n} : m회 이상 n회 이하 반복

m 생략 시 0회 이상, n 생략 시 무한대(2억 개 미만) 까지 반복되는 단어를 찾는다.

find_string(["cat", "dog", "rabbit"], "b{2,}")		# ['rabbit']

b가 2회 이상 반복되는 단어는 'rabbit' 뿐이다.

find_string(["cat", "dog", "rabbit"], "b{,1}")		# ['cat', 'dog', 'rabbit']

b가 0회 이상 1회 이하 반복되는 단어에는 예제 모두 포함된다.

 


한꺼번에 정리하기엔 양이 많은 관계로 짬짬히 이 글에 업데이트할 예정.

2020-02-27 작성 시작

 

Attached

 

Using_Regex.html
0.27MB
Using_Regex.ipynb
0.01MB

Reference

[R] 정규표현식 Regular Expression 에 대한 CheatSheet

RegExCheatsheet.pdf
0.31MB