본문 바로가기
R

[R.아르] 특정 조건에 맞는 글자(이메일 주소)만 추출하기

by LightBlogger 2016. 9. 6.

다음과 같은 x가 있다고 하자.



우리는 여기에서 이메일 주소만 예쁘게 뽑아서


다음과 같이 만들 것이다.



그러기 위해서는 두 가지 함수를 써야 하는데


첫 번째는 '일치하는 문자열만 뽑아줘' regmatches() 이고,


두 번째는 그 일치하는 문자열의 형식을 지정하는 regexpr() 이다.


조합하면 regmatches(regexpr()) 와 같이 될 테니, regexpr()부터 먼저 보자.


사실 regexpr()은 R뿐 아니라 여기저기서 쓰는 유명한 녀석인 '정규표현식' 이라는 녀석을 다루는 함수다.


정규표현식을 다 다루기에는 분량이 너무 방대하고, 일단 팁 하나.


http://regexr.com/


위 사이트에 가면 정규표현식을 공부하고 직접 실습해볼 수 있다. 



이제 이메일 주소에 대한 정규표현식을 만들어 보자.


이메일 주소 형식을 대략적으로 표현하면 다음과 같다.


***@***.***

일단 @과 . 부터 표현해보자. []로 둘러싸 주면 된다. 


***[@]***[.]***

이제 @ 앞 부분을 표현해 보자. 


(공백이나 "/" 등은 포함하지 않는) '모든 알파벳과 숫자'라고 하면 되겠다.


'모든 알파벳과 숫자'는 [a-zA-Z0-9]로 표현한다.


[a-zA-Z0-9][@]***[.]***

.com 이나 .net 등 맨 끝 부분도 마찬가지로 공백과 특수문자를 포함하지 않는 문자일 것이므로 


[a-zA-Z0-9][@]***[.][a-zA-Z0-9]

그런데 [a-zA-Z0-9]는 모든 알파벳과 숫자 '1개'를 의미한다.


맨 앞과 맨 끝에는 일련의 문자열이 온다. 그러니 '여러개'라고 지정해 주어야 할 것이다.


+ 기호를 붙이면 '앞에 있는 문자 여러개' 를 표현하게 된다.


따라서


[a-zA-Z0-9]+[@]***[.][a-zA-Z0-9]+

@와 . 사이에 있는 부분도 [a-zA-Z0-9]+를 이용하면 되나,


@와 . 이 명확한 경계가 되어 주므로 그냥 '아무거나' 라고 선언해 주자.


. 이 '아무거나' 에 해당하는 문자이며, 역시 여러개가 올 수 있으므로 +를 사용하여


[a-zA-Z0-9]+[@].+[.][a-zA-Z0-9]+

와 같이 간단히 적어주면 된다. 


끝!


이지만... 생각해 보면 주소끝에는 .com이나 .net 외에 .co.uk나 .or.kr 등도 올 수 있으므로


① ***[@]***[.]***

② ***[@]***[.]**[.]**

을 모두 생각해 주어야 한다.


즉 ***[@]***[.]까지는 동일하고 그 뒤가 ① 또는 ②의 경우를 모두 포함해야 한다.


이를 위해 'or'의 역할을 하는 연산자 | 를 이용하여 다음과 같이 입력해 주자.


***[@]***[.][***|**[.]**]

*을 적절한 명령으로 바꾸면 다음과 같다.


[a-zA-Z0-9]+[@].+[.][[a-zA-Z0-9]+|[a-zA-Z0-9]+[.][a-zA-Z0-9]+]

마지막으로 하나만 더 추가하자. 


이메일 주소의 @ 앞부분에는 간혹 대시(-)나 언더바(_) 등을 사용하는 유저도 있으므로


다음과 같이 -_.+ 등을 포함시켜야 해당 특수문자가 포함된 메일주소도 정상적으로 추출된다.


[-_.+a-zA-Z0-9]+[@].+[.][[a-zA-Z0-9]+|[a-zA-Z0-9]+[.][a-zA-Z0-9]+]

이렇게 이메일 주소에 대한 정규표현식이 완성되었다.



자, 이제 regexpr()안에 넣어 주자. regexpr()은 regexpr("(정규표현식)", 적용할 벡터) 와 같이 사용하면 된다.


잠깐, 벡터라고?


우리의 x는 벡터가 아닌 데이터프레임이므로, 바꾸어주자.



x의 emails 열만 떼어 와서 한 줄의 벡터를 만들었다.


이제 적용! regmatches()는 regmatches(적용할 벡터, regexpr()) 처럼 적어주면 된다.



조금 복잡해 보이지만, 위의 그 정규표현식 때문에 그렇다.


간단히 하면 아래와 같다.


regmatches(y, regexpr("(이메일 정규표현식)", y))


쨘! 깔끔한 이메일 벡터 z를 얻었다.


데이터프레임으로 보고 싶다면 다시 변환해 주면 된다.







반응형

댓글