[R/Python] 정규표현식
정규표현식은 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
Reference
[R] 정규표현식 Regular Expression 에 대한 CheatSheet